Преобразование строки GUID в octetBytes с помощью PowerShell - PullRequest
1 голос
/ 25 августа 2011

У меня есть скрипт 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 хранит их в формате octetBytes.

Я нашел несколько функций powershell , которые будут выполнять преобразование, но только после удаления фигурных скобок. Метод Guid.ToString должен обеспечить это, но я не могу заставить его работать выше.

Однако, если бы я мог понять, как это сделать, метод Guid.ToByteArray мог бы сделать меня еще ближе.

Кто-нибудь взломал это?

Обновление: ответы помогли мне написать функцию, которая преобразует почтовый ящик в правильный формат для поиска по 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 ]

2 голосов
/ 25 августа 2011

В сочетании с ответом Энди Шнайдера эта функция может оказаться полезной:

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()
1 голос
/ 25 августа 2011

Вы приводите строку к GUID?

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