Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎蒞臨 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何查詢 Active Directory 架構,以得知屬性的資料型別及該屬性是單值或多值?


如何判斷屬性的資料型別,以及屬性是單值或多值?

嗨,Scripting Guy!如何查詢 Active Directory 架構,以得知屬性的資料型別及該屬性是單值或多值?

-- MS

MS,您好。其實您所提出的問題是屬於讓我們抓狂的問題之一:畢竟它看起來似乎很容易回答。您大概也已經猜到了,而其實呢!比我們想像得更複雜一點。

原因何在?嗯,若要繫結至任何 Active Directory 屬性,並找出它是單值或多值倒是不太難;事實上,每一個屬性都有專屬屬性 (isSingleValued),會告訴您這項資訊。我們也知道有一個屬性 (ADsType) 可以告訴您,屬性的資料型別。這不就結了,問題解決了,對吧?

其實不然,很遺憾!問題並未解決。問題在於:當您繫結至架構中的屬性時,並無法取得 ADsType,而是必須從實際物件 (如使用者帳戶) 取得屬性,然後才能判斷其資料型別。這下聽起來就太複雜了:要繫結至結構描述中的屬性,以取得一項資訊,然後必須再繫結至實際物件,以取得第二項資訊。一點也不簡潔優雅,更不用說其他了 (我們 Scripting Guy 一向是對優雅簡潔很引以為傲的)。

所以,我們就開始探查 Active Directory 結構描述,尋找某個項目,希望能夠告訴我們物件的資料型別。最後我們偶然找到從來沒聽過的屬性:oMSyntax,它會傳回指定給屬性的語法值。ADsType 與 oMSyntax 之間有些微差異,但對指令碼編寫者來說,這種差異無關緊要,oMSyntax 所傳回資訊很可能會告訴您所需要知道的一切。

至少我們是這麼希望,因為我們最後選擇走的路:

Set objAttribute = GetObject _
    ("LDAP://cn=telephone-Number,cn=schema,cn=configuration,dc=fabrikam,dc=com")
Wscript.Echo "Single-valued: " & objAttribute.isSingleValued
Select Case objAttribute.oMSyntax
    Case 1
        Wscript.Echo "Datatype: " & "Boolean"
    Case 2
        Wscript.Echo "Datatype: " & "Integer or Enumeration"
    Case 4
        Wscript.Echo "Datatype: " & "String (Octet or SID)"
    Case 6
        Wscript.Echo "Datatype: " & "String (Object-Identifier)"
    Case 10
        Wscript.Echo "Datatype: " & "Integer or Enumeration"
    Case 18
        Wscript.Echo "Datatype: " & "String (Numeric)"
    Case 20
        Wscript.Echo "Datatype: " & "Case-Ignore String (Teletex)"
    Case 27
        Wscript.Echo "Datatype: " & "Case-Sensitive String"
    Case 19
        Wscript.Echo "Datatype: " & "String (Printable or IA5)"
    Case 22
        Wscript.Echo "Datatype: " & "String (Printable or IA5)"
    Case 23
        Wscript.Echo "Datatype: " & "String (UTC-Time or Generalized-Time)"
    Case 24
        Wscript.Echo "Datatype: " & "String (UTC-Time or Generalized-Time)"
    Case 64
        Wscript.Echo "Datatype: " & "String (Unicode)"
    Case 65
        Wscript.Echo "Datatype: " & "Large Integer"
    Case 66
        Wscript.Echo "Datatype: " & "String (NT Security Descriptor)"
    Case 127
        Wscript.Echo "Datatype: " & "Object"
    Case Else
        Wscript.Echo "Datatype: " & "Undefined"
End Select

指令碼一開始是繫結至 Active Directory 中我們所要的屬性 (在本範例中是 telephone-Number):

Set objAttribute = GetObject _
    ("LDAP://cn=telephone-Number,cn=schema,cn=configuration,dc=fabrikam,dc=com")

在這裡要注意兩件事。首先,我們是使用屬性 (telephone-Number) 的 CN,而不是 LDAP 顯示名稱 (telephoneNumber)。這是重點,要牢記在心,因為您很可能已經習慣使用 ADSI 指令碼之中的 LDAP 顯示名稱。

 

附註。如果不知道特定屬性的 CN,請參閱 MSDN 上的 Active Directory 架構參考 (英文)。一般來說,只要在 LDAP 顯示名稱中的各字之間加上連字號,就可以建構 CN。這樣一來,telephoneNumber 就會變成 telephone-Number。不過這並不保證所有情況都能以這種方法運作,因此必要時請參閱「架構參考」。


其次,我們是繫結至結構描述本身,它位於 Configuration 容器中。這並不困難,只不過是跟一般 ADSI 指令碼不同罷了。因此還是一樣,就只是在嘗試探索時必須牢記在心的要點而已。

然後,我們就從其中擷取及報告 isSingleValued 屬性的值:

Wscript.Echo "Single-valued: " & objAttribute.isSingleValued

我們已經說過了:這部份很簡單。而且,其實,下一部份也很簡單:只是利用 Select Case 陳述式,(根據 oMSyntax 的值) 判斷屬性的資料型別而己。我們的 Select Case 陳述式如下:

Select Case objAttribute.oMSyntax

我們只是在 Select Case 區塊中尋找可能的 oMSyntax 值,然後回應相對應的訊息就行了。例如,如果 oMSyntax 等於 64 (在本範例中就是如此),就會觸發下列程式碼行:

Case 64
    Wscript.Echo "Datatype: " & "String (Unicode)"

為 telephone-Number 屬性執行指令碼,就會取回下列資訊:

Single-valued: True
Datatype: String (Unicode)

好,所以呢,其實判斷方法並不是那麼難,只不過是稍微曲折複雜一點。但是您們都了解 Scripting Guy 嘛:只要必須多一點努力,那就…

 

附註:對了!還有一點,我們明白 Select Case 陳述式中顯示的資料型別可能會有點隱晦不清。不過還好,您可以參考 MSDN 上的 語法參考 (英文),更深入了解。



如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首