我一直在努力研究如何在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
答案 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
将任何数组转换为字符串将对上面的代码段执行类似的操作。