powershell - 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 )
成功了。
解决方案
通常对于二进制存储,您需要将字符串转换为字节数组:
$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 计算机是小端系统。
推荐阅读
- regex - 如何在 expressjs 中使用正则表达式和路由参数?
- google-apps-script - 在插件/应用程序脚本中拦截或获取 Google Drive 文件保存和打开的回调
- c# - 如何使用未传递给真实对象的模拟
- automated-tests - 如何使用 rebar3 使用适当的代码设置测试?
- android - Facebook 应用程序上未安装适用于 Android 上的 React Native 的 Facebook SDK
- listview - 如何在flutter中删除自定义小部件之间的空格并在listview.builder中适合小部件
- javascript - 当我尝试在函数中添加一些结果时,为什么 console.log 会打印到控制台“未定义”?
- javascript - JavaScript 中操纵 DOM 的巫术?
- navbar - Bulma css:固定导航栏仍然移动一点
- sql - 使用来自 MS SQL 的 API 检索表的简单方法