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 计算机是小端系统。