通过PowerShell在注册表中设置打印机安全二进制密钥

时间:2015-02-10 01:01:46

标签: powershell printing registry

我一直在努力研究如何在2008 R2中为打印机对象设置安全性。在2012年的机器上非常好看,并希望在2008 R2上做类似的事情但是失败了。

我编写了一个函数来获取该注册表的值,然后编写一个辅助函数来设置不同打印机上的值,但它不接受该值。

预计在打印机上手动设置值以获取所需的权限,然后从中读取并设置为少数其他新添加的打印机。

它回应说明以下错误。

"The type of the value object did not match the specified RegistryValueKind or the object could not be properly converted."

这是我正在摸索的测试代码。

$ComputerName = "TESTSERVER01"

Function Get-RegistryString {
Param(
    [string]$ComputerName,
    [string]$KeyPath,
    [string]$KeyName,
    [string]$KeyValue
    )

$KeyValueType = [Microsoft.Win32.RegistryValueKind]::String

try {
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $ComputerName )
    $regKey = $reg.OpenSubKey($KeyPath, $True)
    $regKey.GetValue($KeyName) 

    } catch {
        Write-Host $_.Exception.Message
        $error.Clear()
        return $false 
    }
}

Function Set-RegistryBinary {
Param(
    [string]$ComputerName,
    [string]$KeyPath,
    [string]$KeyName,
    [string]$KeyValue
    )

$KeyValueType = [Microsoft.Win32.RegistryValueKind]::Binary

try {
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $ComputerName )
    $regKey = $reg.OpenSubKey($KeyPath, $True)
    $regKey.SetValue($KeyName, $KeyValue, $KeyValueType) 

    } catch {
        Write-Host $_.Exception.Message
        $error.Clear()
        return $false 
    }
}


$SecKey = Get-RegistryString -ComputerName $ComputerName -KeyPath "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\W-TEST01" -KeyName "Security"

Set-RegistryBinary -ComputerName $ComputerName -KeyPath "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\W-TEST02" -KeyName "Security" -KeyValue $SecKey

1 个答案:

答案 0 :(得分:1)

您的问题只是第[string]$KeyValue行。您正在将字节数组转换为字符串,该字符串会破坏下一步的数据。我需要做的就是删除演员。也可以将演员表更改为[byte[]]$KeyValue,我认为它也可以。

Function Set-RegistryBinary {
Param(
    [string]$ComputerName,
    [string]$KeyPath,
    [string]$KeyName,
    [byte[]]$KeyValue$KeyValue
    )

您可以在此处查看正在发生的事情的示例。首先,我只是创建一个字节数组。然后使用相同的数组结构我将其转换为字符串。

PS C:\Users\Cameron> [byte[]](1,134,233,5)
1
134
233
5

PS C:\Users\Cameron> [string]([byte[]](1,134,233,5))
1 134 233 5

将任何数组转换为字符串将对上面的代码段执行类似的操作。