Public/Move-ADSIComputer.ps1
function Move-ADSIComputer { <# .SYNOPSIS Function to Move a Computer in Active Directory .DESCRIPTION Function to Move a Computer in Active Directory .PARAMETER Identity Specifies the Identity of the computer You can provide one of the following: DistinguishedName Guid Name SamAccountName Sid System.DirectoryService.AccountManagement.IdentityType https://msdn.microsoft.com/en-us/library/bb356425(v=vs.110).aspx .PARAMETER Credential Specifies alternative credential By default it will use the current user windows credentials. .PARAMETER DomainName Specifies the alternative Domain. By default it will use the current domain. .PARAMETER Destination Specifies the Distinguished Name where the object will be moved .EXAMPLE Move-ADSIComputer -identity 'TESTCOMP01' -Destination 'OU=Servers,DC=FX,DC=LAB' .NOTES Francois-Xavier Cat lazywinadmin.com @lazywinadm github.com/lazywinadmin .LINK https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.computerprincipal(v=vs.110).aspx #> [CmdletBinding()] param ([Parameter(Mandatory=$true)] [string]$Identity, [Alias("RunAs")] [System.Management.Automation.PSCredential] [System.Management.Automation.Credential()] $Credential = [System.Management.Automation.PSCredential]::Empty, $DomainName, $Destination ) BEGIN { Add-Type -AssemblyName System.DirectoryServices.AccountManagement # Create Context splatting $ContextSplatting = @{ ContextType = "Domain" } IF ($PSBoundParameters['Credential']) { $ContextSplatting.Credential = $Credential } IF ($PSBoundParameters['DomainName']) { $ContextSplatting.DomainName = $DomainName } $Context = New-ADSIPrincipalContext @ContextSplatting } PROCESS { TRY{ $Computer = [System.DirectoryServices.AccountManagement.ComputerPrincipal]::FindByIdentity($Context, $Identity) # Retrieve DirectoryEntry #$Computer.GetUnderlyingObject() # Create DirectoryEntry object $NewDirectoryEntry = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList "LDAP://$Destination" # Move the computer $Computer.GetUnderlyingObject().psbase.moveto($NewDirectoryEntry) $Computer.Save() } CATCH { $Error[0] } } } |