PowerShell New-ADComputer 二进制属性
PowerShell New-ADComputer binary attribute
我是 PowerShell 的新手,我有一个必须使用 PowerShell 完成的一次性任务。这也涉及 Active Directory。我需要将一个新的计算机对象添加到我们的 AD 中,我必须在创建时设置的属性之一是一个 16 字节的二进制值。我得到一个字符串作为输入,它是我必须为属性设置的值的十六进制表示。
我尝试输入 asis 值,但没有成功。我尝试用反斜杠转义每个字节,它也不起作用。
我应该如何格式化输入才能使其与 New-ADComputer 命令一起使用?我正在成功设置一堆其他属性。当我从传递给 -OtherAttributes 选项的哈希表中删除这个二进制条目时,它工作正常。所以,显然是格式问题。我没有发现此类属性的预期格式。
有什么提示吗? TIA.
编辑 2018-06-05 19:44 美国东部时间:
我尝试将字符串转换为字节数组,如下所示:
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
这会导致以下错误(我为自己的翻译道歉,因为原始消息显示为法语):
为一个只能有一个的属性指定了许多值
问题已解决:
$netbootGUID = New-Object Guid $args[$indiceArgs]
$otherAttributs.add( "netbootGUID", $netbootGUID )
成功了。
通常对于二进制存储,您需要将字符串转换为字节数组:
$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 并将其与 Active Directory 中的字节数组进行比较来验证它是否正确来进行测试。
有关字节顺序的详细信息,请参阅 the documentation for Guid.ToByteArray()
:
Note that the order of bytes in the returned byte array is different from the string representation of a Guid value. The order of the beginning four-byte group and the next two two-byte groups is reversed, whereas the order of the last two-byte group and the closing six-byte group is the same. The example provides an illustration.
The reason for this is that a GUID is partially constructed from a series of integers of varying sizes, and the UUID standard specifies big endianness for those numbers. x86 计算机是小端系统。
我是 PowerShell 的新手,我有一个必须使用 PowerShell 完成的一次性任务。这也涉及 Active Directory。我需要将一个新的计算机对象添加到我们的 AD 中,我必须在创建时设置的属性之一是一个 16 字节的二进制值。我得到一个字符串作为输入,它是我必须为属性设置的值的十六进制表示。
我尝试输入 asis 值,但没有成功。我尝试用反斜杠转义每个字节,它也不起作用。
我应该如何格式化输入才能使其与 New-ADComputer 命令一起使用?我正在成功设置一堆其他属性。当我从传递给 -OtherAttributes 选项的哈希表中删除这个二进制条目时,它工作正常。所以,显然是格式问题。我没有发现此类属性的预期格式。
有什么提示吗? TIA.
编辑 2018-06-05 19:44 美国东部时间:
我尝试将字符串转换为字节数组,如下所示:
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
这会导致以下错误(我为自己的翻译道歉,因为原始消息显示为法语):
为一个只能有一个的属性指定了许多值
问题已解决:
$netbootGUID = New-Object Guid $args[$indiceArgs]
$otherAttributs.add( "netbootGUID", $netbootGUID )
成功了。
通常对于二进制存储,您需要将字符串转换为字节数组:
$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 并将其与 Active Directory 中的字节数组进行比较来验证它是否正确来进行测试。
有关字节顺序的详细信息,请参阅 the documentation for Guid.ToByteArray()
:
Note that the order of bytes in the returned byte array is different from the string representation of a Guid value. The order of the beginning four-byte group and the next two two-byte groups is reversed, whereas the order of the last two-byte group and the closing six-byte group is the same. The example provides an illustration.
The reason for this is that a GUID is partially constructed from a series of integers of varying sizes, and the UUID standard specifies big endianness for those numbers. x86 计算机是小端系统。