将ObjectGuid从AD转换为GUID powershell

时间:2015-05-05 15:31:02

标签: powershell guid

我无法理解为什么这在PowerShell v4中不起作用:

New-Object -TypeName System.Guid((New-Object -TypeName DirectoryServices.DirectorySearcher -Property @{ Filter = "(&(objectCategory=computer)(name=$env:COMPUTERNAME))" }).FindOne().Properties.Item('objectguid')[0])

这在PowerShell v5中有效:

[Guid]::New((New-Object -TypeName DirectoryServices.DirectorySearcher -Property @{ Filter = "(&(objectCategory=computer)(name=$env:COMPUTERNAME))" }).FindOne().Properties.Item('ObjectGuid')[0])

但不幸的是,PowerShell v4中不存在'新'方法。但是,第一个例子应该有效。 arg是一个字节数组,因为它应该接受:GUID MSDN。但我得到一个错误:

Cannot find an overload for "Guid" and the argument count: "16"

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

我自己偶然发现了这个问题。 原因

New-Object Guid @(,$guidByteArray)

工作时

New-Object Guid $guidByteArray

不是由于powershell v4(及更低版本)如何解析您提供的内容。

前者被解释为将文字数组传递给New-Object的-ArgumentList参数。

后者被解释为将参数列表传递给New-Object的-ArgumentList参数。

Guid(Byte [])构造函数接受一个参数,并且如错误消息所示,Guid结构没有构造函数可接受任何类型的16个参数。

在powershell v5中,Guid :: New()构造函数正确识别您打算传递一个数组,而不是一个参数列表,并选择正确的重载。

答案 1 :(得分:1)

我让它工作,一定是使用了错误的构造函数?我不知道,但这有效:

New-Object -TypeName System.Guid -ArgumentList @(,(New-Object -TypeName DirectoryServices.DirectorySearcher -Property @{ Filter = "(&(objectCategory=computer)(name=$env:COMPUTERNAME))" }).FindOne().Properties.Item('objectguid')[0])

希望它能在某个地方帮助某个人。