使用PowerShell将GUID字符串转换为octetBytes

时间:2011-08-25 15:48:18

标签: powershell guid

我有一个powershell脚本,可以按大小输出所有Exchange 2003邮箱。

$computers = "vexch01","vexch02"
foreach ($computer in $computers) {
  Get-Wmiobject -namespace root\MicrosoftExchangeV2 -class Exchange_Mailbox -computer $computer | sort-object -desc Size | select-object MailboxDisplayName,StoreName,@{Name="Size/Mb";Expression={[math]::round(($_.Size / 1024),2)}}, MailboxGUID | Export-Csv -notype -Path $computer.csv 
}

目前,它将MailboxGUID作为字符串类型GUID输出(例如{21EC2020-3AEA-1069-A2DD-08002B30309D})。我希望在AD中查找AD中的用户,但AD将它们存储为octetBytes格式。

我找到了一些powershell functions来进行转换,但只有当花括号被删除时才会进行转换。 Guid.ToString方法应该提供这个,但我不能让它在上面工作。

但是,如果我能弄清楚如何做到这一点,那么Guid.ToByteArray方法可能会让我更接近。

有没有人破解过这个?

更新:到目前为止,答案帮助我编写了一个函数,可以将mailboxguid转换为正确的格式,以便通过LDAP进行搜索。但是,我现在无法在脚本中使用它。这是我更新的脚本:

function ConvertGuidToLdapSearchString(
    [parameter(mandatory=$true, position=0)]$Guid
)
{
    $guid_object = [System.Guid]$Guid
    ($guid_object.ToByteArray() | foreach { '\' + $_.ToString('x2') }) -join ''
}

# Gets data through WMI from specified Exchange mailbox servers
$servers = "vexch01","vexch02"
foreach ($server in $servers) {
  Get-Wmiobject -namespace root\MicrosoftExchangeV2 -class Exchange_Mailbox -computer $computer | sort-object -desc Size | select-object MailboxDisplayName,StoreName,@{Name="Size/Mb";Expression={[math]::round(($_.Size / 1024),2)}}, @{Name="LDAP Guid";Expression={ConvertGuidToLdapSearchString(MailboxGUID)}} | Export-Csv -notype -Path $server.csv 
}

我不确定为什么在select-object @{Name="LDAP Guid";Expression={ConvertGuidToLdapSearchString(MailboxGUID)}}中使用该功能不起作用。

select-object中是否有另一种使用此函数的方法可以提供字符串?

2 个答案:

答案 0 :(得分:2)

结合Andy Schneider的回答,您可能会发现此功能很有用:

function Convert-GuidToLdapSearchString(
    [parameter(mandatory=$true, position=0)][guid]$Guid
)
{
    ($Guid.ToByteArray() | foreach { '\' + $_.ToString('x2') }) -join ''
}

(我认为通过向System.Guid添加ScriptProperty有一个更聪明的方法来做到这一点,但我似乎已经了解到你无法有效地将成员添加到结构体。)

我不确定我根据你的评论理解你想要完成什么,但我想你可能刚刚遗漏了$ _。这是一个有点人为的例子,它创建一个具有GUID属性的对象,然后使用select和Convert-GuidToLdapSearchString来转换格式。我希望它有所帮助。

$o = New-Object PSObject -Property @{ GUID = $([Guid]::NewGuid()) }
$o
$o | select @{ Name='SearchString'; Expression={ Convert-GuidToLdapSearchString $_.GUID } }

这完全不是我想象所使用的功能。我希望你能用它来创建一个LDAP搜索子句,例如:

$searchString = Convert-GuidToLdapSearchString '{9e76c48b-e764-4f0c-8857-77659108a41e}'
$searcher = [adsisearcher]"(msExchMailboxGuid=$searchString)"
$searcher.FindAll()

答案 1 :(得分:1)

您是否将字符串转换为GUID?

$guid = [System.Guid]"{21EC2020-3AEA-1069-A2DD-08002B30309D}"
$guid.ToString()
$guid.ToByteArray()