【问题标题】:Change value in registry on multiple servers using credentials使用凭据在多个服务器上更改注册表中的值
【发布时间】:2023-10-01 01:14:01
【问题描述】:

希望在多台远程计算机上启用 reg 密钥。 尝试 1:

$Servers = Get-Content "C:\PowerShell\TestServers.txt"
$Path = "HKLM:\SYSTEM\CurrentControlSet\Services\"
$Property = "*REG_WORD NAME*"
$Value = "1"

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

错误:Set-ItemProperty:不允许请求的注册表访问。 注意:检查有效访问,正在使用的帐户对特定配置单元具有 FULLControl 尝试2: 创建了一个函数,添加了 get-credential cmdlet

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:\SYSTEM\CurrentControlSet\Services\"
    Name = "*keyname*"
    Value = "1"
}
    Set-RemoteRegistryValue @remoteKeyParams -Credential (Get-Credential)    

我尝试将多台机器作为字符串和文本文件放入:

[string]$ComputerName = "name","name","name"
 ComputerName = c:\temp\testservers.txt

我在这里做错了什么吗?

【问题讨论】:

  • 我看到的第一个问题是您遍历服务器但从未真正引用它们。您是否缺少Invoke-Command
  • 我看到的第二个问题是[string]$ComputerName = "name","name","name" 是一个字符串。你可能是说[string[]]$ComputerName = "name","name","name" 我要么坚持每行一个服务器名称的文件,要么切换到使用 CSV

标签: powershell powershell-remoting registrykey


【解决方案1】:

确认你每行有一个服务器,然后你应该这样写。

$Servers = Get-Content "C:\PowerShell\TestServers.txt"
$Path = "HKLM:\SYSTEM\CurrentControlSet\Services\"
$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 时,它将全部异步运行(在 5.1 上默认最多 32 个)

【讨论】:

  • 考虑接受它作为未来访问者利益的答案。
最近更新 更多