Изменение значения в реестре на нескольких серверах с использованием учетных данных

#powershell #powershell-remoting #registrykey

#powershell #powershell -удаленное управление #registrykey

Вопрос:

Требуется включить reg-ключ на нескольких удаленных компьютерах. Попытка 1:

 $Servers = Get-Content "C:PowerShellTestServers.txt"
$Path = "HKLM:SYSTEMCurrentControlSetServices"
$Property = "*REG_WORD NAME*"
$Value = "1"

Foreach ($Server in $Servers) 
{
  Set-ItemProperty -Path $Path -Name $Property -Value $Value
}
  

Ошибка: Set-ItemProperty: запрошенный доступ к реестру не разрешен.
ПРИМЕЧАНИЕ: проверен эффективный доступ, используемая учетная запись имеет полный контроль над конкретным кустом
Попытка 2:
Создал функцию, добавил командлет get-credential

 function Set-RemoteRegistryValue {
    param (
        $ComputerName,
        $Path,
        $Name,
        $Value,
        [ValidateNotNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential = [System.Management.Automation.PSCredential]::Empty
    )
    
        $null = Invoke-Command -ComputerName $ComputerName -ScriptBlock {
            Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
        } -Credential $Credential
}
  

Теперь я могу вызвать функцию и установить значение ключа reg по желанию, но только на одной машине за раз:

 $remoteKeyParams = @{
    ComputerName ='name' 
    Path = "HKLM:SYSTEMCurrentControlSetServices"
    Name = "*keyname*"
    Value = "1"
}
    Set-RemoteRegistryValue @remoteKeyParams -Credential (Get-Credential)    
  

Я попытался ввести несколько компьютеров в виде строки и текстового файла:

 [string]$ComputerName = "name","name","name"
 ComputerName = c:temptestservers.txt
  

Я делаю что-то очень неправильное здесь?

Комментарии:

1. Первая проблема, которую я вижу, заключается в том, что вы перебираете серверы, но никогда не ссылаетесь на них. Вам не хватает Invoke-Command ?

2. Вторая проблема, которую я вижу, — [string]$ComputerName = "name","name","name" это одна строка. Вы, вероятно, имели [string[]]$ComputerName = "name","name","name" в виду, что я бы либо придерживался файла с одним именем сервера в строке, либо переключился на использование CSV

Ответ №1:

Подтвердите, что у вас есть один сервер на строку, а затем вот как вы должны это написать.

 $Servers = Get-Content "C:PowerShellTestServers.txt"
$Path = "HKLM:SYSTEMCurrentControlSetServices"
$Property = "*REG_WORD NAME*"
$Value = "1"

Invoke-Command -ComputerName $servers -ScriptBlock {
            Set-ItemProperty -Path $using:Path -Name $using:Name -Value $using:Value
        } -Credential $Credential
  

Когда вы передаете все имена серверов Invoke-Command , он запускает их все асинхронно (до 32 по умолчанию на 5.1)

Комментарии:

1. Рассмотрите возможность принятия этого в качестве ответа в интересах будущих посетителей.