我是PowerShell的新手,我需要执行一次性任务,必须使用PowerShell完成。这也涉及Active Directory。我需要在AD中添加一个新的计算机对象,并且我必须在创建时设置的一个属性是一个16字节的二进制值。我得到一个字符串,它是我必须为属性设置的值的十六进制表示。
我尝试输入值asis但它不起作用。我尝试用反斜杠转义每个字节,它也不起作用。
如何格式化输入以使用New-ADComputer命令?我成功地设置了一堆其他属性。当我从传递给-OtherAttributes选项的哈希表中删除此二进制条目时,它工作正常。所以,显然是格式问题。我没有发现这些属性的预期格式。
任何提示? TIA。
EDIT 2018-06-05 19:44 EDT:
我尝试将字符串转换为字节数组,如下所示:
Function Convert-Hex2ByteArray {
[cmdletbinding()]
param(
[parameter(Mandatory=$true)]
[String]
$HexString
)
[byte[]] $Bytes = @(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
For($i=0; $i -lt $HexString.Length; $i+=2) {
$Bytes[$i/2] = [convert]::ToByte($HexString.Substring($i, 2), 16)
}
$Bytes
}
(...)
$netbootGUID = Convert-Hex2ByteArray($args[$indiceArgs])
$otherAttributes.add( "netbootGUID", $netbootGUID )
(...)
New-ADComputer -Credential $cred -Server $ADhost -Path "CN=Computers,$baseDN" -SAMAccountName $sAMAccountName -Name $name-Instance 4 -OtherAttributes $otherAttributes
这会导致以下错误(我为自己的翻译道歉,因为原始邮件以法语显示):
为attribut指定了许多值,只能有一个
问题解决了:
$netbootGUID = New-Object Guid $args[$indiceArgs]
$otherAttributs.add( "netbootGUID", $netbootGUID )
诀窍。
答案 0 :(得分:2)
通常,对于二进制存储,您需要将字符串转换为字节数组:
$String = '3c6ef75eaa2c4b23992bbd65ac891917'
$ByteArray = [byte[]]$(for ($i = 0; $i -lt $String.Length; $i+=2) { [Convert]::ToByte($String.Substring($i,2), 16) })
将其转换回来:
$NewString = -join $(foreach($Byte in $ByteArray) { $Byte.ToString('x2') })
如果您希望字符大写,请指定'X2'
而不是'x2'
。
由于您要存储16个字节的值,我会注意到,如果您要存储GUID,可能需要更改存储顺序,因为字节顺序为GUID的字符串表示形式与x86系统上GUID的字节表示形式的字节顺序不匹配。幸运的是,有内置的函数可以使用内置的System.Guid
数据类型处理此转换:
$GUID = 'f8d89eb2b49c4bfeab44a85ccdc4191a'
$ByteArray = [Guid]::new($GUID).ToByteArray()
用于转换回来的构造函数:
$NewGUID = [Guid]::new($ByteArray)
您是否应该使用此方法取决于您正在更新的确切属性以及将使用相关属性的应用程序是否将正确处理GUID或是否正确处理GUID ;只是将GUID存储为原始字节(这是不正确但不奇怪)。您必须通过查看应用程序看到的GUID并将其与Active Directory中的字节数组进行比较来验证它是否正确。
有关字节排序的详细信息,请参阅the documentation for Guid.ToByteArray()
:
请注意,返回的字节数组中的字节顺序与Guid值的字符串表示形式不同。开始的四字节组和接下来的两个双字节组的顺序相反,而最后两个字节组和结束六字节组的顺序相同。该示例提供了一个说明。