0

我首先通过以下方式查询 Exchange Server 2003:

POSH>get-wmiobject -class Exchange_mailbox -namespace Root\MicrosoftExchangeV2 -server srv02 

来获取用户。可用的属性之一是mailboxguid。所以为了测试,我跑

POSH> get-qaduser -identity <mailboxguid> 

但是它不起作用。我需要对mailboxguid 做些什么特别的事情吗?

提前致谢

4

2 回答 2

1

Get-QADUser 尝试通过以下属性之一解析对象:DN、SID、GUID、UPN 或 Domain\UserName,mailboxguid 不是其中之一。也就是说,您可以使用邮箱“MailboxDisplayName”属性作为 Get-QADUser 的标识:

get-wmiobject -class Exchange_mailbox -namespace Root\MicrosoftExchangeV2 -server srv02 | 获取 QADUser -identity {$_.MailboxDisplayName}

编辑:如果您不能使用 MailboxDisplayName,请尝试解析 LegacyDN WMI 属性:

get-wmiobject -class Exchange_mailbox -namespace Root\MicrosoftExchangeV2 -computerName srv02| 获取 QADUser -identity {$ .LegacyDN.substring($ .LegacyDN.lastIndexOf("=")+1)}

顺便说一句,将 -server 替换为 -computerName,Get-WMIObject 没有 -server 参数。我另外你可以采取其他方式而不使用 WMI 来获取启用邮箱的对象,你可以直接查询 AD:

获取 QADObject -sizeLimit 0 -ldap "(homeMDB=*)"

于 2009-02-17T08:47:19.330 回答
1

我认为问题出在其他地方:如果您通过其名称从 AD 获取对象(例如用户)并查看ObjectGUID,它包含如下字符串:

(Get-QADUser -Identity myDomain\myUser).ObjectGUID 
-> CAEC64A025153143A6755E0A3DAB5C1A

要通过其 GUID 获取同一用户,您必须指定:

(Get-QADUser -Identity A064ECCA-1525-4331-A675-5E0A3DAB5C1A).ObjectGUID
-> CAEC64A025153143A6755E0A3DAB5C1A

如果您比较这些 GUID,您会注意到它们看起来有些相似但并不相同:

CAEC64A0-2515-3143-A675-5E0A3DAB5C1A
A064ECCA-1525-4331-A675-5E0A3DAB5C1A

出现此问题的原因是System.GUID使用与 Active Directory 不同的字节顺序来构造 GUID。

您可以像这样更正它(VB.NET):

Private Shared Function GetCorrectGuid(ByVal aWrongGuid As Guid) As Guid
  Dim myGuidString As String = aWrongGuid.ToString("N")
  Dim myWrongGuid As Char() = myGuidString.ToCharArray()
  Dim myCorrectGuid As Char() = myGuidString.ToCharArray()
  myCorrectGuid(0) = myWrongGuid(6)
  myCorrectGuid(1) = myWrongGuid(7)
  myCorrectGuid(2) = myWrongGuid(4)
  myCorrectGuid(3) = myWrongGuid(5)
  myCorrectGuid(4) = myWrongGuid(2)
  myCorrectGuid(5) = myWrongGuid(3)
  myCorrectGuid(6) = myWrongGuid(0)
  myCorrectGuid(7) = myWrongGuid(1)
  myCorrectGuid(8) = myWrongGuid(10)
  myCorrectGuid(9) = myWrongGuid(11)
  myCorrectGuid(10) = myWrongGuid(8)
  myCorrectGuid(11) = myWrongGuid(9)
  myCorrectGuid(12) = myWrongGuid(14)
  myCorrectGuid(13) = myWrongGuid(15)
  myCorrectGuid(14) = myWrongGuid(12)
  myCorrectGuid(15) = myWrongGuid(13)
  Return New Guid(New String(myCorrectGuid, 0, 32))
End Function

或者这个(C#):

private static Guid GetCorrectGuid(Guid aWrongGuid) {
  string myGuidString = aWrongGuid.ToString("N");
  char[] myWrongGuid = myGuidString.ToCharArray();
  char[] myCorrectGuid = myGuidString.ToCharArray();
  myCorrectGuid[0] = myWrongGuid[6];
  myCorrectGuid[1] = myWrongGuid[7];
  myCorrectGuid[2] = myWrongGuid[4];
  myCorrectGuid[3] = myWrongGuid[5];
  myCorrectGuid[4] = myWrongGuid[2];
  myCorrectGuid[5] = myWrongGuid[3];
  myCorrectGuid[6] = myWrongGuid[0];
  myCorrectGuid[7] = myWrongGuid[1];
  myCorrectGuid[8] = myWrongGuid[10];
  myCorrectGuid[9] = myWrongGuid[11];
  myCorrectGuid[10] = myWrongGuid[8];
  myCorrectGuid[11] = myWrongGuid[9];
  myCorrectGuid[12] = myWrongGuid[14];
  myCorrectGuid[13] = myWrongGuid[15];
  myCorrectGuid[14] = myWrongGuid[12];
  myCorrectGuid[15] = myWrongGuid[13];
  return new Guid(new string(myCorrectGuid, 0, 32));
}

是的,我知道这不是最有效的方法,但我现在根本没有时间将它重写为基于字节数组并使用 arraycopy 的函数。对不起。

希望对你有帮助

于 2011-02-28T10:14:46.190 回答