{"id":688,"date":"2010-02-28T13:23:28","date_gmt":"2010-02-28T13:23:28","guid":{"rendered":"https:\/\/www.wapshere.com\/missmiis\/?page_id=688"},"modified":"2010-02-28T13:29:34","modified_gmt":"2010-02-28T13:29:34","slug":"create-fimsecgroups-ps1","status":"publish","type":"page","link":"https:\/\/www.wapshere.com\/missmiis\/create-fimsecgroups-ps1","title":{"rendered":"create-fimsecgroups.ps1"},"content":{"rendered":"<p># Create criteria-base security groups from a CSV file.<\/p>\n<p># The CSV file must include a header row, such as in the following example (without the leading hashes):<\/p>\n<p>#DisplayName,AccountName,Description,Filter<br \/>\n#SG-Geneva,sgGeneva,Staff based in Geneva,\/Person[(EmployeeType = &#8216;Employee&#8217;) and (OfficeLocation = &#8216;Geneva&#8217;)]<br \/>\n#SG-Engineers,sgEngineers,All Engineers,\/Person[(EmployeeType = &#8216;Employee&#8217;) and ((starts-with(JobTitle, &#8216;Consultant&#8217;)) or (starts-with(JobTitle, &#8216;Technical&#8217;)))]<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\u00c2\u00a0set-variable -name CSV -value &#8220;C:\\groups.csv&#8221;<br \/>\n\u00c2\u00a0set-variable -name URI -value &#8220;http:\/\/localhost:5725\/resourcemanagementservice&#8221;<br \/>\n\u00c2\u00a0set-variable -name DOMAIN -value &#8220;MYDOMAIN&#8221;<br \/>\n\u00c2\u00a0set-variable -name SCOPE -value &#8220;Global&#8221;<br \/>\n\u00c2\u00a0set-variable -name TYPE -value &#8220;Security&#8221;<br \/>\n\u00c2\u00a0set-variable -name OWNER -value &#8220;Administrator&#8221;<br \/>\n\u00c2\u00a0set-variable -name PREFILTER -value &#8220;&lt;Filter xmlns:xsi=`&#8221;http:\/\/www.w3.org\/2001\/XMLSchema-instance`&#8221; xmlns:xsd=`&#8221;http:\/\/www.w3.org\/2001\/XMLSchema`&#8221; Dialect=`&#8221;http:\/\/schemas.microsoft.com\/2006\/11\/XPathFilterDialect`&#8221; xmlns=`&#8221;http:\/\/schemas.xmlsoap.org\/ws\/2004\/09\/enumeration`&#8221;&gt;&#8221;<br \/>\n\u00c2\u00a0set-variable -name POSTFILTER -value &#8220;&lt;\/Filter&gt;&#8221;<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\u00c2\u00a0function SetAttribute<br \/>\n\u00c2\u00a0{<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 PARAM($object, $attributeName, $attributeValue)<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 END<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 {<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 write-host $attributeName $attributeValue<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportChange<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange.Operation = 1<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange.AttributeName = $attributeName<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange.AttributeValue = $attributeValue<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange.FullyResolved = 1<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $importChange.Locale = &#8220;Invariant&#8221;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 if ($object.Changes -eq $null) {$object.Changes = (,$importChange)}<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 else {$object.Changes += $importChange}<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 }<br \/>\n}<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\u00c2\u00a0function CreateObject<br \/>\n\u00c2\u00a0{<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 PARAM($objectType)<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 END<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 {<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $newObject = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportObject<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $newObject.ObjectType = $objectType<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $newObject.SourceObjectIdentifier = [System.Guid]::NewGuid().ToString()<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $newObject<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 }<br \/>\n\u00c2\u00a0}<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n<p>if(@(get-pssnapin | where-object {$_.Name -eq &#8220;FIMAutomation&#8221;} ).count -eq 0) {add-pssnapin FIMAutomation}<\/p>\n<p># Get Owner<br \/>\n$ownerObject = export-fimconfig -uri $URI `<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 \u00e2\u20ac\u201conlyBaseResources `<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 -customconfig &#8220;\/Person[AccountName=&#8217;$OWNER&#8217;]&#8221;<br \/>\nif($ownerObject -eq $null) {throw &#8220;Owner not found!&#8221;}<br \/>\n$ownerID = $ownerObject.ResourceManagementObject.ObjectIdentifier -replace &#8220;urn:uuid:&#8221;,&#8221;&#8221;<\/p>\n<p># Import CSV and process each line<br \/>\nimport-csv(&#8220;C:\\Development\\FIM\\powershell\\groups.csv&#8221;) | foreach {<\/p>\n<p>\u00c2\u00a0# Check if a group with the same name already exists<br \/>\n\u00c2\u00a0$objectName = $_.DisplayName<br \/>\n\u00c2\u00a0$exportObject = export-fimconfig -uri $URI `<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 \u00e2\u20ac\u201conlyBaseResources `<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 -customconfig &#8220;\/Group[DisplayName=&#8217;$objectName&#8217;]&#8221;<br \/>\n\u00c2\u00a0if($exportObject) {write-host &#8220;`nGroup $objectName already exists&#8221;}<br \/>\n\u00c2\u00a0else<br \/>\n\u00c2\u00a0 {<br \/>\n\u00c2\u00a0 $filter = $PREFILTER + $_.Filter + $POSTFILTER<\/p>\n<p>\u00c2\u00a0 # Create group and add attributes<br \/>\n\u00c2\u00a0 $newGroup = CreateObject -objectType &#8220;Group&#8221;<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;DisplayName&#8221; -attributeValue $objectName<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;AccountName&#8221; -attributeValue $_.AccountName<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Domain&#8221; -attributeValue $DOMAIN<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Scope&#8221; -attributeValue $SCOPE<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Type&#8221; -attributeValue $TYPE<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Filter&#8221; -attributeValue $filter<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Description&#8221; -attributeValue $_.Description<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;Owner&#8221; -attributeValue $ownerID<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;DisplayedOwner&#8221; -attributeValue $ownerID<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;MembershipLocked&#8221; -attributeValue $true<br \/>\n\u00c2\u00a0 SetAttribute -object $newGroup -attributeName &#8220;MembershipAddWorkflow&#8221; -attributeValue &#8220;None&#8221;<br \/>\n\u00c2\u00a0<br \/>\n\u00c2\u00a0 # Import group into the FIM Portal<br \/>\n\u00c2\u00a0 $newGroup | Import-FIMConfig -uri $URI<br \/>\n\u00c2\u00a0 write-host &#8220;`nGroup creation request complete`n&#8221;<br \/>\n\u00c2\u00a0 }<br \/>\n\u00c2\u00a0}<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n\u00c2\u00a0trap<br \/>\n\u00c2\u00a0{<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 $exMessage = $_.Exception.Message<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 if($exMessage.StartsWith(&#8220;L:&#8221;))<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 {write-host &#8220;`n&#8221; $exMessage.substring(2) &#8220;`n&#8221; -foregroundcolor white -backgroundcolor darkblue}<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 else {write-host &#8220;`nError: &#8221; $exMessage &#8220;`n&#8221; -foregroundcolor white -backgroundcolor darkred}<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0 Exit<br \/>\n\u00c2\u00a0}<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n","protected":false},"excerpt":{"rendered":"<p># Create criteria-base security groups from a CSV file. # The CSV file must include a header row, such as in the following example (without the leading hashes): #DisplayName,AccountName,Description,Filter #SG-Geneva,sgGeneva,Staff based in Geneva,\/Person[(EmployeeType = &#8216;Employee&#8217;) and (OfficeLocation = &#8216;Geneva&#8217;)] #SG-Engineers,sgEngineers,All Engineers,\/Person[(EmployeeType = &#8216;Employee&#8217;) and ((starts-with(JobTitle, &#8216;Consultant&#8217;)) or (starts-with(JobTitle, &#8216;Technical&#8217;)))] #&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- \u00c2\u00a0set-variable -name CSV -value &#8220;C:\\groups.csv&#8221;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"class_list":["post-688","page","type-page","status-publish","hentry"],"jetpack_shortlink":"https:\/\/wp.me\/Pkp1o-b6","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/comments?post=688"}],"version-history":[{"count":6,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/688\/revisions"}],"predecessor-version":[{"id":702,"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/pages\/688\/revisions\/702"}],"wp:attachment":[{"href":"https:\/\/www.wapshere.com\/missmiis\/wp-json\/wp\/v2\/media?parent=688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}