<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.dirteam.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Paul Bergson (MVP - Directory Services) : powershell, Dynamic Security Group</title><link>http://blogs.dirteam.com/blogs/paulbergson/archive/tags/powershell/Dynamic+Security+Group/default.aspx</link><description>Tags: powershell, Dynamic Security Group</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>RODC - Password Replication Policy and Password Cache Management</title><link>http://blogs.dirteam.com/blogs/paulbergson/archive/2010/09/22/rodc-password-replication-group-management.aspx</link><pubDate>Wed, 22 Sep 2010 18:17:00 GMT</pubDate><guid isPermaLink="false">4afa41f1-c118-406e-beda-ba054a9f6c33:5211</guid><dc:creator>Paul Bergson</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.dirteam.com/blogs/paulbergson/comments/5211.aspx</comments><wfw:commentRss>http://blogs.dirteam.com/blogs/paulbergson/commentrss.aspx?PostID=5211</wfw:commentRss><description>&lt;P&gt;With the advent of Read Only Domain Controllers (RODC) remote offices no longer have to present a risk for your Active Directory (AD) enterprise secrets.&amp;nbsp; RODC's by default do not cache ANY user or computer passwords.&amp;nbsp; This can present a problem if there is a loss of connectivity between the remote site's RODC&amp;nbsp;and a Read Write Domain Controller (RWDC), since without caching since neither a user or computer&amp;nbsp;will be able to authenticate.&amp;nbsp; You can however specifiy that their passwords be&amp;nbsp;cached either by including a group or specific user in the Password Replication Policy on the RODC at the remote site.&amp;nbsp; Access to this policy is gained by opening up the RODC computer object and selecting the "Password Replication Policy" tab.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;It is realtively simple to add and remove user and computer objects, simply click on the "Add" or "Remove" button and modify the membership.&amp;nbsp; Problem is this can be very dynamic, users and computers are consisting coming and going and management of this can become extremely tedious.&amp;nbsp; Even if you are using group membership, this still has to be maintained.&lt;/P&gt;
&lt;P&gt;I have found the use of Powershell was the piece I needed to resolve the problem.&amp;nbsp; It was important though that I am able to determine where a user or computer exists.&amp;nbsp; There is no software out there that can determine where an object exists without some clear definition.&amp;nbsp; Fortunately for me I have a nightly syncronization program between HR and AD that keeps all my users objects address accurate.&amp;nbsp; Now I just need a way to&amp;nbsp;determine my machine object location.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;After doing some thinking I quickly realized that I already know which machines reside at any one site by the subnet definitions within AD Sites and Services.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Now that I had things clear in my process, I had to find a way to gather all the information.&amp;nbsp; I decided that Powershell would be the best path to go, since I had two defined process.&amp;nbsp; &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Determine the ip subnets within the site I wanted to build my group for&lt;/LI&gt;
&lt;LI&gt;Query for all DNS records within the doman the RODC belongs to&lt;/LI&gt;
&lt;LI&gt;Query AD to determine which of the DNS hosts are members of the AD domain&lt;/LI&gt;
&lt;LI&gt;Update the computer objects location with a value that defines this sites lcoation&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Since the users and computers move around so much clear out the current group membership &lt;/LI&gt;
&lt;LI&gt;Read all computer and user objects and those that have the specific location defined add to the Site Group&lt;/LI&gt;&lt;/UL&gt;&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;I have posted both scripts below, you will note that the users "City" attribute is not touched since this should be a managed attribute by your HR department.&amp;nbsp; Both scripts can be run on within a single task, just make sure that the Dynamic Security group sub-task is run second.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Note: Script&amp;nbsp;2 will generate churn for DC replication.&amp;nbsp; This rebuilds the group everytime it is run, so it will cause the group and its membership to be rereplicated wether or not there were any changes.&amp;nbsp; Not a big deal for small to midsized shops without expensive links or significant numbers of DC's, but if you have 100,000's of objects or 100's of dc's this is not efficient.&amp;nbsp; I hope to rewrite this to manage delta's only.&lt;/STRONG&gt;&lt;/P&gt;

&lt;P&gt;1)&lt;/P&gt;
&lt;P&gt;import-module activeDirectory&lt;BR&gt;#&lt;BR&gt;# Script&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - UpdateSiteLocation.ps1&lt;BR&gt;# Author&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Paul Bergson&lt;BR&gt;# Date Written - 09/22/2010&lt;BR&gt;# Description&amp;nbsp; - Script will populate the location field of all computer accounts that reside in a specific site&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When used in association with the Powershell script to dynamically populate the members&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; of a security group of all computer and user accounts with the same location.&amp;nbsp; This group can&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; be part of the Password Replication Policy (PRP) for an RODC in the defined site.&lt;/P&gt;
&lt;P&gt;$ErrorActionPreference = "SilentlyContinue"&lt;/P&gt;
&lt;P&gt;# Get the subnets associated with Boswell and place them in the array $ipSubNetAry&lt;BR&gt;$ipSubNetAry = @()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Create an empty array&lt;BR&gt;$UpdateSite = "Site-Timbuktu"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Define the site that you want to build the array for&lt;BR&gt;$locationName = "Timbuktu"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Define the value you want populated in the object's "Location" attribute&lt;/P&gt;
&lt;P&gt;$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()&lt;BR&gt;$sites = $forest.Sites&lt;BR&gt;Foreach ($site in $sites)&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $MPSubNets = $site.Subnets&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForEach($MPSubNet in $MPSubNets)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If($MPSubNet.site.name -eq $UpdateSite)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ipSubNetAry = $ipSubNetAry + $MPSubNet.Name.Substring(0,($MPSubNet.Name.Length-5))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;# Go get the host records from the sites in the array of the subnets&lt;BR&gt;$dnsRecords = gwmi -computername computer.domain.com -namespace root\microsoftDNS -Query ('select OwnerName, IPAddress from MicrosoftDNS_AType where DomainName = "domain.com"')&lt;/P&gt;
&lt;P&gt;# Now that all host records have been captured look for matching subnet's and see if they reside in Active Directory&lt;BR&gt;ForEach ($hostRecord in $dnsRecords)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {$ServerIpAddress = $HostRecord.IpAddress&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForEach($ipSubNet in $ipSubNetAry)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $FoundMatch = $ServerIpAddress.StartsWith($IpSubNet)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($FoundMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $FQDN = $hostRecord.OwnerName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Sam = $FQDN.Split(".")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Get the AD computer object to see if it needs to be updated&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Sam[0] holds the host name from the fqdn when the array is formed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ComputerObj = $Null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Clear prior to call otherwise old value stays in object variable&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ComputerObj = get-adcomputer -identity $Sam[0] -properties Location&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($error[0])&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Don't process if host not available&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForEach($NewComputer in $ComputerObj)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($NewComputer.Location -ne $locationName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {write-output $NewComputer.samAccountName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Not really needed other than if run locally&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-output $FoundIpAddress&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # it will provide feedback on the machines updated&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Next line does the actual update.&amp;nbsp; It should be commented out during any testing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-ADComputer $NewComputer.samAccountName -Location $locationName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;

&lt;P&gt;2)&lt;/P&gt;
&lt;P&gt;# Program buildDynamicSecurityGroup&lt;BR&gt;# Author&amp;nbsp; Paul Bergson&lt;BR&gt;# Date Written&amp;nbsp;&amp;nbsp; September 20, 2010&lt;BR&gt;# Description&amp;nbsp;&amp;nbsp;&amp;nbsp; This will recreate the membership list of the AD security group "DynamicSecurityGroup".&amp;nbsp; This group is used to manage&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; whose passwords are cached on the RODC in Timbuktu&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; By using the attribute City on USers and Location on Computers this is a Dynamic Security Group&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This script is run nightly &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;# Get the ad cmdlets imported&lt;BR&gt;import-module ActiveDirectory&lt;BR&gt;$siteName = "Timbuktu"&lt;/P&gt;
&lt;P&gt;# Clear all current members&lt;BR&gt;&amp;nbsp; get-adgroupmember DynamicSecurityGroup | %{remove-adgroupmember DynamicSecurityGroup $_.SamAccountName -Confirm:$false}&lt;/P&gt;
&lt;P&gt;# Add all users and computers to the $SiteName global security group&lt;BR&gt;&amp;nbsp;get-aduser -filter{city -like $siteName} | %{Add-ADGroupMember DynamicSecurityGroup $_.SamAccountName}&lt;BR&gt;&amp;nbsp;get-adcomputer -filter{location -like $siteName} | %{Add-ADGroupMember DynamicSecurityGroup $_.SamAccountName}&lt;/P&gt;&lt;img src="http://blogs.dirteam.com/aggbug.aspx?PostID=5211" width="1" height="1"&gt;</description><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/Active+Directory/default.aspx">Active Directory</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/password+replication+policy/default.aspx">password replication policy</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/RODC/default.aspx">RODC</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/PRP/default.aspx">PRP</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/powershell/default.aspx">powershell</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/read+Only+Domain+Controller/default.aspx">read Only Domain Controller</category><category domain="http://blogs.dirteam.com/blogs/paulbergson/archive/tags/Dynamic+Security+Group/default.aspx">Dynamic Security Group</category></item></channel></rss>