none
Переименование ПК в домене RRS feed

  • Вопрос

  • Добрый день.

    Есть домен уровня функциональности Windows Server 2012. В домене машины Win XP и Win7. Имена машин имеют вид:

    domen-w-xxx(раб.станции) или domen-n-xxx(ноут),где xxx- число,которое может быть 3-х,4-х или 5-ти значным.

    Ну так вот: хотелось бы скриптом переименовать машины в домене по следующему алгоритму:

    1. если число 3-х значное - дописать с переди числа два ноля.(например - было имя domen-w-555 или domen-n-555 должно стать  domen-w-00555 )

    2. если число 4-х значное - дописать с переди числа ноль.(например - было имя domen-w-5555 или domen-n-5555 должно стать  domen-w-05555 ) 

    3.если число 5-ти значное - не переименовывать машину

    Заранее спасибо.

    Буду благодарен за любую помощь!!!!

    7 апреля 2014 г. 9:14

Ответы

  • workflow RenameComputer {
    	param($computerName)
    	foreach -parallel($computer in $computerName) { 
    		if (Test-Connection  -Count 2 -Quiet -ComputerName $computer.OldName) 
    		{ 
    			InlineScript 
    			{
    				$user =  'Domain\User'
    				$pass =  'P@$$w0rd1' 
    
    				try {
    					$wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $using:computer.OldName -Authentication PacketPrivacy -ErrorAction Stop
    					$result = $wmi.Rename($using:computer.NewName,$pass,$user)
    					if(!$result.ReturnValue) {
    						$result = $true
    						$wmi = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $using:computer.OldName
    						$wmi.Win32Shutdown(6)
    					}
    					else {
    						$result = $false
    					}
    				}
    				
    				catch {
    					$result = $false
    					Add-Content -Path errors.log -Value $_
    				}
    				
    				$output = [PSCustomObject]@{
    					ComputerName = $using:computer
    					Result = $result
    				}
    				
    				$output
    			}
    		}
    	}
    }
    
     
    $ou = "Ou=ORgComputers,Dc=Contoso,DC=Com"
    $comps = Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $ou | Where {$_.Name -match "-\d{3,4}$"} | Foreach {
    	$new = [regex]::Replace($_.Name,"\b\d{3,4}\b",{$args.value.padleft("5","0")})
    	[pscustomobject]@{
    		OldName = $_.Name
    		NewName = $new
    	}
    }
    
    RenameComputer $comps

    • Помечено в качестве ответа KazunEditor 21 апреля 2014 г. 16:00
    11 апреля 2014 г. 8:24
    Отвечающий

Все ответы

  • $ou = "Ou=ORgComputers,Dc=Contoso,DC=Com"
    Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $ou | Where {$_.Name -match "-\d{3,4}$"} | Foreach {
    	$new = [regex]::Replace($_.Name,"\b\d{3,4}\b",{$args.value.padleft("5","0")})
    	Rename-Computer -ComputerName $_.Name -NewName $new -Force -Restart
    }


    • Изменено KazunEditor 7 апреля 2014 г. 9:40
    • Предложено в качестве ответа Sergey Korotkov 7 апреля 2014 г. 13:09
    7 апреля 2014 г. 9:24
    Отвечающий
  •  А Вы не подскажите как добавить проверку на доступность ПК и вывод результата в файл?

    И ещё не скажите как использовать Workflow для foreach -parallel т.к. машин много и хотелось бы ускорить. На Вашем сайте я читал заметку по поводу  Workflow  в posh может подскажите????

    8 апреля 2014 г. 7:44
  • Доступность - используем ping:

    workflow RenameComputer {
    	param($computerName)
    	foreach -parallel($computer in $computerName) { 
    		if (Test-Connection  -Count 2 -Quiet -ComputerName $computer.OldName) 
    		{ 
    			InlineScript 
    			{
    				try {
    					Rename-Computer -ComputerName $using:computer.OldName -NewName $using:computer.NewName -Force -Restart
    					$result = $true
    				}
    				
    				catch {
    					$result = $false
    					Add-Content -Path errors.log -Value $_
    				}
    				
    				$output = [PSCustomObject]@{
    					ComputerName = $using:computer
    					Result = $result
    				}
    				
    				$output
    			}
    		}
    	}
    }
    
     
    $ou = "Ou=ORgComputers,Dc=Contoso,DC=Com"
    $comps = Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $ou | Where {$_.Name -match "-\d{3,4}$"} | Foreach {
    	$new = [regex]::Replace($_.Name,"\b\d{3,4}\b",{$args.value.padleft("5","0")})
    	[pscustomobject]@{
    		OldName = $_.Name
    		NewName = $new
    	}
    }
    
    RenameComputer $comps


    • Изменено KazunEditor 9 апреля 2014 г. 8:21 $computer.OldName
    8 апреля 2014 г. 8:13
    Отвечающий
  • Извините за задержку но пишет вот что:

    Microsoft.PowerShell.Utility\Write-Error : Cannot validate argument on parameter 'ComputerName'. The argument is null or empty. Supply an argument that is not null
    or empty and then try the command again.
    At RenameComputer:4 char:4
    +
    + CategoryInfo : NotSpecified: (:) [Write-Error], ParameterBindingValidationException
    + FullyQualifiedErrorId : System.Management.Automation.ParameterBindingValidationException,Microsoft.PowerShell.Commands.WriteErrorCommand
    + PSComputerName : [localhost]

    9 апреля 2014 г. 7:33
  • Заменить строку Test-Connection  -Count 2 -Quiet -ComputerName $computer.DNSHostName на:

    Test-Connection  -Count 2 -Quiet -ComputerName $computer.OldName

    9 апреля 2014 г. 8:12
    Отвечающий
  • Запускаю из PowerShell ISE с правами Enterprise Admin.

    На машинах с Win 7 пишет:

    Rename-Computer : Cannot establish the WMI connection to the computer 'domen-W-555' with the following error message: Access is denied. (Exception from HRESULT: 
    0x80070005 (E_ACCESSDENIED)).
    At RenameComputer:6 char:6
    +
      + CategoryInfo : OperationStopped: (domen-W-555:String) [Rename-Computer], InvalidOperationException
    + FullyQualifiedErrorId : RenameComputerException,Microsoft.PowerShell.Commands.RenameComputerCommand
    + PSComputerName : [localhost]

    а на машинах с Win XP SP3 вот что:

    Rename-Computer : Cannot establish the WMI connection to the computer 'domen-W-1210' with the following error message: Access is denied. (Exception from HRESULT: 
    0x80070005 (E_ACCESSDENIED)).
    At RenameComputer:6 char:6
    +
      + CategoryInfo : OperationStopped: (domen-W-1210:String) [Rename-Computer], InvalidOperationException
    + FullyQualifiedErrorId : RenameComputerException,Microsoft.PowerShell.Commands.RenameComputerCommand
    + PSComputerName : [localhost]

    хотя служба RPC запущена и файервол выключен...

    10 апреля 2014 г. 9:00
  • Попробуйте указать DomainCredential:

    $pass = ConvertTo-SecureString -String 'P@$$w0rd1' -AsPlainText -Force
    $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "Domain\User",$pass
    Rename-Computer -ComputerName $using:computer.OldName -NewName $using:computer.NewName -DomainCredential $cred -Force -Restart

    10 апреля 2014 г. 16:49
    Отвечающий
  • Гы. Теперь ошибок нет но и машины не переименовываются. А можно ли переименовать комп не использую камандлета  Rename-Computer???
    11 апреля 2014 г. 6:16
  • Можно попробовать WMI:

    $user =  'Domain\User'
    $pass =  'P@$$w0rd1' 
    
    try {
    	$wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $using:computer.OldName -Authentication PacketPrivacy -ErrorAction Stop
    	$result = $wmi.Rename($using:computer.NewName,$pass,$user)
    	if(!$result.ReturnValue) {
    		$result = $true
    		$wmi = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $using:computer.OldName
    		$wmi.Win32Shutdown(6)
    	}
    	else {
    		$result = $false
    	}
    }

    • Предложено в качестве ответа Vector BCOModerator 11 апреля 2014 г. 7:25
    11 апреля 2014 г. 6:36
    Отвечающий
  • А можно для особо одарённых весь скрипт? А то у меня что то не получается...
    11 апреля 2014 г. 7:27
  • workflow RenameComputer {
    	param($computerName)
    	foreach -parallel($computer in $computerName) { 
    		if (Test-Connection  -Count 2 -Quiet -ComputerName $computer.OldName) 
    		{ 
    			InlineScript 
    			{
    				$user =  'Domain\User'
    				$pass =  'P@$$w0rd1' 
    
    				try {
    					$wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $using:computer.OldName -Authentication PacketPrivacy -ErrorAction Stop
    					$result = $wmi.Rename($using:computer.NewName,$pass,$user)
    					if(!$result.ReturnValue) {
    						$result = $true
    						$wmi = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $using:computer.OldName
    						$wmi.Win32Shutdown(6)
    					}
    					else {
    						$result = $false
    					}
    				}
    				
    				catch {
    					$result = $false
    					Add-Content -Path errors.log -Value $_
    				}
    				
    				$output = [PSCustomObject]@{
    					ComputerName = $using:computer
    					Result = $result
    				}
    				
    				$output
    			}
    		}
    	}
    }
    
     
    $ou = "Ou=ORgComputers,Dc=Contoso,DC=Com"
    $comps = Get-ADComputer -Filter {Enabled -eq $true} -SearchBase $ou | Where {$_.Name -match "-\d{3,4}$"} | Foreach {
    	$new = [regex]::Replace($_.Name,"\b\d{3,4}\b",{$args.value.padleft("5","0")})
    	[pscustomobject]@{
    		OldName = $_.Name
    		NewName = $new
    	}
    }
    
    RenameComputer $comps

    • Помечено в качестве ответа KazunEditor 21 апреля 2014 г. 16:00
    11 апреля 2014 г. 8:24
    Отвечающий