2011-08-25 72 views
1

我有一個按大小輸出所有Exchange 2003郵箱的powershell腳本。使用PowerShell將GUID字符串轉換爲octetBytes

$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中使用此函數的另一種方法,它會給字符串?

+0

我更新了我的答案並提供了更多信息。 – OldFart

回答

2

與安迪·施奈德的回答的同時,你會發現這個功能很有用:

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

(我想我有一個更聰明的方式通過添加ScriptProperty到的System.Guid要做到這一點,但我似乎已經學會了,你不能有效地增加成員結構。)

我不知道我理解你正在嘗試根據您的意見來完成什麼,但我想你可能剛剛離開了$ _。這是一個有點人爲的例子,它創建一個屬性爲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() 
+0

這非常有用。我已經設法將其應用於單個GUID,並且它確實以非常簡單的方式以正確的方式返回它。但是,我不確定如何將這個結合到我的腳本中。我已經在腳本的頂部聲明瞭函數,但是當我使用'select-object @ {Name =「LDAP Guid」; Expression = {ConvertGuidToLdapSearchString(MailboxGUID)}}調用它時,'我沒有在CSV文件。我想我在這裏找到一些基本的PowerShell的東西 - 任何指針? – dunxd

+0

如果可以的話,我會再次給你投票。謝謝 - 這破了!你是對的 - 這需要進入一個搜索條款,所以我可以得到與每個郵箱關聯的用戶名。一步一步來... – dunxd

1

您是否將字符串轉換爲GUID?

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