2011-08-25 2 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 
} 

현재이 문자열 타입 GUID는 MailboxGuid로 출력한다 (예를 들어, {21EC2020-3AEA - 1,069 - - A2DD 08002B30309D}). 나는 이것으로 AD에서 사용자를 찾고 싶지만 AD는 그것을 octetBytes 형식으로 저장합니다.

나는 중괄호를 제거 할 때만 변환을 수행 할 일부 powershell functions을 발견했습니다. Guid.ToString 메서드가이 메서드를 제공해야하지만 위의 메서드는 작동하지 않습니다.

그러나 어떻게해야하는지 알 수 있다면 Guid.ToByteArray 메서드를 사용하면 더 가까워 질 수 있습니다.

누구나 이것을 해킹 했습니까?

업데이트 : 지금까지 답변을 통해 LDAP를 통해 올바른 형식으로 mailboxguid를 변환하는 기능을 작성하는 데 도움이되었습니다. 그러나 이제 스크립트에서이 작업을 수행 할 수 없습니다. 작동하지 않는 @{Name="LDAP Guid";Expression={ConvertGuidToLdapSearchString(MailboxGUID)}}으로 select-object에서 함수를 사용하는 이유를 잘 모르겠어요

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에이 함수를 사용하는 다른 방법이 있습니까?

+0

자세한 내용은 내 대답이 업데이트되었습니다. – OldFart

답변

2

, 유용한이 기능을 찾을 수 있습니다 :

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

(I, 나는 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 검색 절을 만들 때 다음과 같은 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()