<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Access on Janik von Rotz</title>
    <link>https://janikvonrotz.ch/tags/access/</link>
    <description>Recent content in Access on Janik von Rotz</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 12 May 2017 09:46:48 +0000</lastBuildDate>
    <atom:link href="https://janikvonrotz.ch/tags/access/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The most simple access control for your Meteor React app</title>
      <link>https://janikvonrotz.ch/2017/05/12/the-most-simple-access-control-for-your-meteor-react-app/</link>
      <pubDate>Fri, 12 May 2017 09:46:48 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2017/05/12/the-most-simple-access-control-for-your-meteor-react-app/</guid>
      <description>&lt;p&gt;For my last Meteor React app I&amp;rsquo;ve designed the most simple role based access control. The basic idea is that users can have multiple roles and every action possible is only allowed by a specified set of roles. For my Meteor React app the following scenarios were considered:&lt;/p&gt;&#xA;&lt;p&gt;Only users with specific roles are allowed to&amp;hellip;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;call a Meteor method.&lt;/li&gt;&#xA;&lt;li&gt;subscribe to a publication.&lt;/li&gt;&#xA;&lt;li&gt;display React components in the UI.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;To solve this problem a role based access control (RBAC) has been implemented:&lt;/p&gt;&#xA;&lt;p&gt;user -&amp;gt; roles -&amp;gt; action -&amp;gt; permission for publication / method / component&lt;/p&gt;&#xA;&lt;p&gt;Now you might miss the url access control as a scenario, why did I ignore it? Well, the answer is simple, a user won&amp;rsquo;t access what he can&amp;rsquo;t see. As long as we hide buttons and links which might lead to a restricted view and control access on the data layer properly, there&amp;rsquo;s no need to have access control for urls.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;/imports/helpers/config.js&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The config file merges the access control list (acl) and Meteor settings. For every possible action a set of roles is defined.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import { Meteor } from &amp;#39;meteor/meteor&amp;#39;&#xA;import { objectAssign } from &amp;#39;./index&amp;#39;&#xA;&#xA;let acl = {&#xA;  // routers permissions&#xA;  &amp;#39;routers.read&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39;, &amp;#39;user&amp;#39; ],&#xA;  &amp;#39;routers.insert&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;routers.update&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;routers.remove&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39; ],&#xA;  &amp;#39;routers.restore&amp;#39;: [ &amp;#39;admin&amp;#39; , &amp;#39;spec&amp;#39; ],&#xA;  &amp;#39;routers.export&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39; ],&#xA;&#xA;  // notification permissions&#xA;  &amp;#39;notifications.read&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;notifications.receive&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;notifications.insert&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;notifications.remove&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39;, &amp;#39;tech&amp;#39; ],&#xA;  &amp;#39;notifications.export&amp;#39;: [ &amp;#39;admin&amp;#39;, &amp;#39;spec&amp;#39; ],&#xA;}&#xA;&#xA;export default objectAssign(Meteor.settings.private, Meteor.settings.public, { acl: acl })&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Of course you could create a collection to store the acl and make the permission model dynamic.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;/imports/helpers/isAllowed.js&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the only function required to check the users permission.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import { config } from &amp;#39;./index&amp;#39;&#xA;&#xA;export default (action, roles) =&amp;gt; {&#xA;  let allowed = false&#xA;  let allowedRoles = config.acl[action]&#xA;  roles = roles != null ? roles : []&#xA;  roles.map((role) =&amp;gt; {&#xA;     allowed = allowedRoles.indexOf(role) != -1&#xA;  })&#xA;  return allowed&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simple isn&amp;rsquo;t it?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;/server/methods/routers.js&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This example shows how the permission is checked in a Meteor method.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...&#xA;import { isAllowed } from &amp;#39;/imports/helpers&amp;#39;&#xA;&#xA;export default () =&amp;gt; {&#xA;  Meteor.methods({&#xA;    &amp;#39;routers.insert&amp;#39;(object) {&#xA;      check(object, Object)&#xA;&#xA;      // check permissions&#xA;      let roles = Meteor.userId() ? Meteor.user().roles : null&#xA;      if (!isAllowed(&amp;#39;routers.insert&amp;#39;, roles)) {&#xA;        throw new Meteor.Error(i18n.error.insufficent_rights, i18n.message.insufficent_rights_for_method)&#xA;      }&#xA;&#xA;      // insert object&#xA;      ...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Make sure the permission check is the first thing done when the method is executed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;/server/publication/router.js&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now we restrict access on the data access layer.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...&#xA;import { isAllowed } from &amp;#39;/imports/helpers&amp;#39;&#xA;&#xA;export default () =&amp;gt; {&#xA;&#xA;  Meteor.publish(&amp;#39;routers.list&amp;#39;, function(selector = {}) {&#xA;&#xA;    // check permissions&#xA;    let user = Meteor.users.findOne(this.userId)&#xA;    let roles = user ? user.roles : null&#xA;    if (isAllowed(&amp;#39;routers.read&amp;#39;, roles)) {&#xA;      return Routers.find(selector)&#xA;    } else {&#xA;      this.stop()&#xA;      return&#xA;    }&#xA;  })&#xA;  ...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The user roles are accessible using &lt;code&gt;this.user&lt;/code&gt; in a publication.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;client/routers/Router.js&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally you can restrict the visibility of React components quite easily.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...&#xA;import { isAllowed } from &amp;#39;/imports/helpers&amp;#39;&#xA;&#xA;class Router extends React.Component {&#xA;  ...&#xA;  render() {&#xA;    let { loading, user, i18n } = this.props&#xA;    return loading ? &amp;lt;CircularProgress /&amp;gt; : &amp;lt;Card&amp;gt;&#xA;          ...&#xA;&#xA;          { isAllowed(&amp;#39;routers.update&amp;#39;, user ? user.roles : null) ?&#xA;          &amp;lt;RaisedButton&#xA;          type=&amp;#34;submit&amp;#34;&#xA;          label={ i18n.button.update }&#xA;          primary={ true } /&amp;gt;&#xA;          : null }&#xA;&#xA;          { isAllowed(&amp;#39;routers.remove&amp;#39;, user ? user.roles : null) ?&#xA;          &amp;lt;RaisedButton&#xA;          onTouchTap={ this.toggleDialog.bind(this, &amp;#39;openRemoveDialog&amp;#39;) }&#xA;          label={ i18n.button.remove }&#xA;          secondary={ true } /&amp;gt;&#xA;          : null }&#xA;&#xA;          ...&#xA;    &amp;lt;/Card&amp;gt;&#xA;  }&#xA;}&#xA;&#xA;export default Router&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see the &lt;code&gt;isAllowed&lt;/code&gt; function is used for all scenarios.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://janikvonrotz.ch/wp-content/uploads/2017/05/Meteor-React-component-access-control.gif&#34;&gt;&lt;img src=&#34;https://janikvonrotz.ch/wp-content/uploads/2017/05/Meteor-React-component-access-control.gif&#34; alt=&#34;Untitled&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Do you like this solution? Leave a comment and tell my more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Manage access rights to the Office365 portal</title>
      <link>https://janikvonrotz.ch/2013/09/30/manage-the-access-rights-to-the-office365-portal/</link>
      <pubDate>Mon, 30 Sep 2013 14:24:08 +0000</pubDate>
      <guid>https://janikvonrotz.ch/2013/09/30/manage-the-access-rights-to-the-office365-portal/</guid>
      <description>&lt;p&gt;In addition to my last script showing how to manage the user licenses in Office365 I&amp;rsquo;ve written a new script for assign, remove or replace the access rights in the office365 portal.&lt;/p&gt;&#xA;&lt;p&gt;The script has the same structure as the license management script, feel free as always to copy and alter this script or asking me questions about it.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;#&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;$Metadata = @{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Title = &amp;#34;Set Office365 User Rights&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Filename = &amp;#34;Set-O365UserRights.ps1&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Description = @&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;Manage Office365 portal access rights with ActiveDirectory groups.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;Assign Administration roles to the members of specified AD groups or by a users userprincipalname.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Tags = &amp;#34;powershell, activedirectory, office365, user, rights&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Project = &amp;#34;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Author = &amp;#34;Janik von Rotz&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    AuthorContact = &amp;#34;https://janikvonrotz.ch&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    CreateDate = &amp;#34;2013-08-13&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    LastEditDate = &amp;#34;2013-09-26&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Url = &amp;#34;https://gist.github.com/janikvonrotz/6218401&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    Version = &amp;#34;3.0.0&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    License = @&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Switzerland License.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/3.0/ch/ or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#39;@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# settings&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $MsolRoleConfig = @{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ADGroup = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;S-1-5-21-1744926098-708661255-2033415169-37011&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# O365F_Billing Administrator&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        MsolRoleName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Billing Administrator&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Get-MsolRole&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        User = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;admin@vbluzern.onmicrosoft.com&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# O365F_Billing Administrator&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        MsolRoleName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Company Administrator&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Get-MsolRole&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# modules&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Import-Module MSOnline&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Import-Module MSOnlineExtended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Import-Module ActiveDirectory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#--------------------------------------------------#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# import credentials&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $Credential = Import-PSCredential $(Get-ChildItem -Path $PSconfigs.Path -Filter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Office365.credentials.config.xml&amp;#34;&lt;/span&gt; -Recurse).FullName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# connect to office365&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Connect-MsolService -Credential $Credential&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $UserAndMsolRole = @(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ($MsolRoleConfig | where{$_.ADGroup &lt;span style=&#34;color:#f92672&#34;&gt;-ne&lt;/span&gt; $null} | %{$MsolRole = $_.MsolRoleName; $MsolRole = (Get-MsolRole | where{$_.Name &lt;span style=&#34;color:#f92672&#34;&gt;-eq&lt;/span&gt; $MsolRole}); Get-ADGroupMember $_.ADGroup -Recursive |Get-ADUser | select UserPrincipalName, @{Name = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MsolRole&amp;#34;&lt;/span&gt;; Expression={$MsolRole}}}),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ($MsolRoleConfig | where{$_.User &lt;span style=&#34;color:#f92672&#34;&gt;-ne&lt;/span&gt; $null}| %{$MsolRole = $_.MsolRoleName; $_ | select @{L = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UserPrincipalName&amp;#34;&lt;/span&gt;; E = {$_.User}},@{L = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MsolRole&amp;#34;&lt;/span&gt;; E = {Get-MsolRole | where{$_.Name &lt;span style=&#34;color:#f92672&#34;&gt;-eq&lt;/span&gt; $MsolRole}}}})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $MsolRoleMembers = Get-MsolRole | %{$MsolRole = $_; Get-MsolRoleMember -RoleObjectId $_.ObjectID -MemberObjectTypes User | where{$_.isLicensed} | select @{L = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UserPrincipalName&amp;#34;&lt;/span&gt;; E = {$_.EmailAddress}},@{L = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MsolRole&amp;#34;&lt;/span&gt;; E = {$MsolRole}}}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (Get-MsolUser -All) | %{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $MsolUser = $_&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $AlreadyAssigned = $MsolRoleMembers | where{$_.UserPrincipalName &lt;span style=&#34;color:#f92672&#34;&gt;-eq&lt;/span&gt; $MsolUser.UserPrincipalName}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $ToAssign = $UserAndMsolRole | where{$_.UserPrincipalName &lt;span style=&#34;color:#f92672&#34;&gt;-eq&lt;/span&gt; $MsolUser.UserPrincipalName}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($AlreadyAssigned){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(($ToAssign) &lt;span style=&#34;color:#f92672&#34;&gt;-and&lt;/span&gt; ($AlreadyAssigned.MsolRole.ObjectId &lt;span style=&#34;color:#f92672&#34;&gt;-ne&lt;/span&gt; $ToAssign.MsolRole.ObjectId)){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Write-Host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Replace role: &lt;/span&gt;$($AlreadyAssigned.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; with: &lt;/span&gt;$($ToAssign.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; for: &lt;/span&gt;$($MsolUser.UserPrincipalName)&lt;span style=&#34;color:#e6db74&#34;&gt;.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Remove-MsolRoleMember -RoleMemberEmailAddress $MsolUser.UserPrincipalName -RoleMemberType User -RoleName $AlreadyAssigned.MsolRole.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Add-MsolRoleMember -RoleMemberEmailAddress $MsolUser.UserPrincipalName -RoleMemberType User -RoleName $ToAssign.MsolRole.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&lt;span style=&#34;color:#66d9ef&#34;&gt;elseif&lt;/span&gt;($ToAssign &lt;span style=&#34;color:#f92672&#34;&gt;-eq&lt;/span&gt; $null){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Write-Host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Remove role: &lt;/span&gt;$($AlreadyAssigned.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; for: &lt;/span&gt;$($MsolUser.UserPrincipalName)&lt;span style=&#34;color:#e6db74&#34;&gt;.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Remove-MsolRoleMember -RoleMemberEmailAddress $MsolUser.UserPrincipalName -RoleMemberType User -RoleName $AlreadyAssigned.MsolRole.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Write-Host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Role: &lt;/span&gt;$($AlreadyAssigned.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; for: &lt;/span&gt;$($MsolUser.UserPrincipalName)&lt;span style=&#34;color:#e6db74&#34;&gt; is already assigned.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&lt;span style=&#34;color:#66d9ef&#34;&gt;elseif&lt;/span&gt;($ToAssign &lt;span style=&#34;color:#f92672&#34;&gt;-and&lt;/span&gt; $MsolUser.IsLicensed){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Write-Host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Assign role: &lt;/span&gt;$($ToAssign.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; for: &lt;/span&gt;$($MsolUser.UserPrincipalName)&lt;span style=&#34;color:#e6db74&#34;&gt;.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Add-MsolRoleMember -RoleMemberEmailAddress $MsolUser.UserPrincipalName -RoleMemberType User -RoleName $ToAssign.MsolRole.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&lt;span style=&#34;color:#66d9ef&#34;&gt;elseif&lt;/span&gt;($ToAssign){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Not possible to assign role: &lt;/span&gt;$($ToAssign.MsolRole.Name)&lt;span style=&#34;color:#e6db74&#34;&gt; user: &lt;/span&gt;$($MsolUser.UserPrincipalName)&lt;span style=&#34;color:#e6db74&#34;&gt; has to be licensed.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Send-PPErrorReport -FileName &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DirSync.mail.config.xml&amp;#34;&lt;/span&gt; -ScriptName $MyInvocation.InvocationName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}```&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[https&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;//gist.github.com/janikvonrotz/&lt;span style=&#34;color:#ae81ff&#34;&gt;6763616&lt;/span&gt;](https&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;//gist.github.com/janikvonrotz/&lt;span style=&#34;color:#ae81ff&#34;&gt;6763616&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;h1&amp;gt;Requirements&amp;lt;/h1&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;li&amp;gt;&amp;lt;a href=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://codeberg.org/janikvonrotz/Powershell-Profile&amp;#34;&lt;/span&gt;&amp;gt;Powershell-Profile&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;li&amp;gt;Office365 with ADFS and DirSync&amp;lt;/li&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
