Бинарный атрибут PowerShell New-ADComputer - PullRequest
0 голосов
/ 05 июня 2018

Я новичок в 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 )

Сделал трюк.

1 Ответ

0 голосов
/ 05 июня 2018

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

$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 компьютеры - система с прямым порядком байтов.

...