Двоичный атрибут PowerShell New-ADComputer

Я новичок в PowerShell, и мне нужно выполнить разовую задачу, которую нужно выполнить с помощью PowerShell. Это касается и Active Directory. Мне нужно добавить новый компьютерный объект в нашу AD, и один из атрибутов, который я должен установить во время создания, — это 16-байтовое двоичное значение. Я получаю в качестве ввода строку, которая представляет собой шестнадцатеричное представление значения, которое я должен установить для атрибута.

Я попытался ввести значение asis, и это не сработало. Я пытался экранировать каждый байт обратной косой чертой, это тоже не работает.

Как мне отформатировать ввод, чтобы он работал с командой New-ADComputer? Я успешно устанавливаю кучу других атрибутов. Когда я удаляю эту двоичную запись из моей хеш-таблицы, переданной в параметр -OtherAttributes, она работает нормально. Итак, очевидно, проблема с форматом. Я ничего не нашел об ожидаемом формате для таких атрибутов.

Любые подсказки? ТИА.

РЕДАКТИРОВАТЬ 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 )

Сделал трюк.


person Achille    schedule 05.06.2018    source источник
comment
где твой код?   -  person Avshalom    schedule 05.06.2018
comment
Вопрос довольно прямолинеен. Код не добавит дальнейшего понимания, поскольку вопрос заключается в том, как вы передаете двоичное значение в New-ADComputer для правильного обновления AD. Вот строка кода, которая касается: New-ADComputer -Credential $cred -Server $host -Path CN=Computers,$baseDN -SAMAccountName $sAMAccountName -Name $wsName -Instance 4 -OtherAttributes $otherAttributes, где $otherAttributes - хеш-таблица который содержит семь атрибутов, один из которых является двоичным атрибутом. Когда я удаляю двоичный атрибут из hastable, все работает нормально.   -  person Achille    schedule 05.06.2018
comment
Какой атрибут и почему он должен быть установлен именно таким образом?   -  person Bill_Stewart    schedule 05.06.2018
comment
Я не проектировал объект AD, который мне нужно обновить. Единственное, что я знаю об этом, это 16-байтовое двоичное значение. Не мне обсуждать, хорош этот дизайн или нет, и есть ли другой путь. Он существует уже много лет, и теперь мне приходится с ним взаимодействовать.   -  person Achille    schedule 06.06.2018


Ответы (1)


Обычно для двоичного хранилища вам необходимо преобразовать строку в массив байтов:

$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 не совпадает порядок байтов в байтовом представлении GUID в системе x86. К счастью, есть встроенные функции для обработки этого преобразования со встроенным типом данных System.Guid:

$GUID = 'f8d89eb2b49c4bfeab44a85ccdc4191a'
$ByteArray = [Guid]::new($GUID).ToByteArray()

И конструктор для обратного преобразования:

$NewGUID = [Guid]::new($ByteArray)

Следует ли вам использовать этот метод, зависит от того, какое именно свойство вы обновляете, и от того, будут ли приложения, которые будут использовать рассматриваемое свойство, правильно обрабатывать идентификаторы GUID или они просто сохраняют GUID как необработанные байты (что неверно, но не удивительно). Вам нужно будет проверить, увидев, какой идентификатор GUID видит ваше приложение, и сравнив его с массивом байтов в Active Directory, чтобы убедиться, что он правильный.

Подробнее о порядке следования байтов см. в разделе документация для Guid.ToByteArray():

Обратите внимание, что порядок байтов в возвращаемом массиве байтов отличается от строкового представления значения Guid. Порядок начальной четырехбайтовой группы и следующих двух двухбайтовых групп обратный, тогда как порядок последней двухбайтовой группы и закрывающей шестибайтовой группы одинаков. В примере представлена ​​иллюстрация.

Причина этого в том, что GUID частично состоит из ряда целых чисел разного размера, и стандарт UUID определяет порядок байтов для этих чисел. Компьютеры x86 — это системы с прямым порядком байтов.

person Bacon Bits    schedule 05.06.2018
comment
В основном то, что я пробовал после вопроса, очень похоже на то, что вы предлагаете. Я добавил свой код в свой исходный пост. - person Achille; 06.06.2018