您好,MS。您知道,这个问题是那种可以让我们发疯的问题:尽管它看起来是如此容易回答。不过,您多半已经意识到它事实上比我们预想的还要复杂一点儿。
为什么会是这样?是这样,绑定到任何 Active Directory 属性并确定其为单值还是多值相当容易;事实上,每个属性都有其自己的属性 (isSingleValued),通过该属性正可了解该信息。我们还知道有一个属性 (ADsType) 可以让您了解属性的数据类型。大功告成,不是吗?
嗯,遗憾的是,事实并非如此。实际情况是,绑定到架构中的属性时无法获取 ADsType;而是必须从实际对象(如用户帐户)检索属性,然后才可以确定数据类型。这听起来太过复杂:先绑定到架构中的属性以获取一部分信息,然后再绑定到实际对象以获取另一部分信息。至少可以说不是非常讲究。(要知道,我们这些脚本专家可是以优雅自居的。)
因此我们开始在 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)
好了,不过这并不是全部困难;呵呵,开个玩笑。但您是了解那些脚本专家的:即便有什么事情需要让他们付出最微乎其微的努力,都会…。
|
注意:顺便说一句,我们意识到 Select Case 语句中显示的某些数据类型可能看起来有点愚钝。幸运的是,您可以浏览一下 MSDN 上的语法参考,了解有关 oMSyntax 可能值(及这些值含义)的更多信息。 |