#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. Рассмотрите возможность принятия этого в качестве ответа в интересах будущих посетителей.