首页 > 解决方案 > PowerShell New-ADComputer 二进制属性

问题描述

我是 PowerShell 的新手,我要执行一个必须使用 PowerShell 完成的一次性任务。这也涉及 Active Directory。我需要在我们的 AD 中添加一个新的计算机对象,并且我必须在创建时设置的属性之一是一个 16 字节的二进制值。我得到一个字符串作为输入,它是我必须为属性设置的值的十六进制表示。

我尝试输入值 asis 但它不起作用。我尝试用反斜杠转义每个字节,它也不起作用。

我应该如何格式化输入以使用 New-ADComputer 命令?我正在成功设置一堆其他属性。当我从传递给 -OtherAttributes 选项的哈希表中删除此二进制条目时,它工作正常。所以,显然是格式问题。我没有发现这些属性的预期格式。

有什么提示吗?TIA。

编辑 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

这会导致以下错误(我为自己的翻译道歉,因为原始消息以法语显示):

为只能有一个属性的属性指定了许多值

问题解决了:

$netbootGUID = New-Object Guid $args[$indiceArgs]
$otherAttributs.add( "netbootGUID", $netbootGUID )

成功了。

标签: powershellactive-directorybinary-data

解决方案


通常对于二进制存储,您需要将字符串转换为字节数组:

$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 中的字节数组进行比较来进行测试,以验证它是否正确。

有关字节顺序的详细信息,请参阅以下文档Guid.ToByteArray()

请注意,返回的字节数组中的字节顺序与 Guid 值的字符串表示不同。开始的四字节组和接下来的两个二字节组的顺序相反,而最后的二字节组和结束的六字节组的顺序相同。该示例提供了一个说明。

原因是 GUID 部分是由一系列不同大小的整数构成的,而 UUID 标准为这些数字指定了大字节序。 x86 计算机是小端系统。


推荐阅读