嗨,脚本专家 ! 浏览 Active Directory

The Microsoft Scripting Guys

可在代码下载: HeyScriptingGuy2009_02.exe(151 KB)

内容

提供帮助
Nitty-Gritty
Helper 函数

您可能知道 脚本编辑器和 I 只有最近已成为新全职 Microsoft 脚本专家,并我们花费大量时间大筛选通过到的电子邮件的成千上万个, Scripter@Microsoft.com电子邮件帐户。 不具有实际委任一个研究,我们想 Venture 猜出答案的数字的一个电子邮件问题,我们看到"何处可以获取 Active Directory 浏览器"。 但是,您猜会怎样呢? 我们永远不会过该操作。 我们介绍了查找,但找不到它。

最后之后删除机密的邮件的一个数的 Internet 消息板上,得到编码的响应的 deciphered 时, 指定给我们的 ADSI Scriptomatic实际上是在 Active Directory 浏览器。 和,不调用在 Active Directory 浏览器和其目的不实际浏览 (它帮助您创建 ADSI 脚本) 的 Active Directory,因此我决定编写 Windows power­shell 脚本,将允许您浏览 Active Directory 架构。 它称为,奇怪,BrowseActiveDirectory­schema.ps1, 图 1 中显示。

图 1 BrowseActiveDirectorySchema.ps1

Param($action,$class, [switch]$help)

Function GetHelp()
{
  $helpText= '
@"
 DESCRIPTION:
 NAME: BrowseActiveDirectorySchema.ps1
 Browse Active Directory Schema. Lists Classes, and properties. 

 PARAMETERS: 
 -Action <L(ist all classes), M(andatory), O(ptional), F(ind)>
 -Class class to search: user, computer, person, contact etc
 -Help displays this help topic

 SYNTAX:
 BrowseActiveDirectorySchema.ps1 -A L
 Lists the name of each class defined in the AD schema

 BrowseActiveDirectorySchema.ps1 -A M -c user
 Lists the mandatory properties of the user class

 BrowseActiveDirectorySchema.ps1 -A O -c computer
 Lists the optional properties of the computer class

 BrowseActiveDirectorySchema.ps1 -A F -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -Action Find -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -help
 Prints the help topic for the script
"@ #end helpText
  $helpText
} #end GetHelp
Function GetADSchema($Action, $class)
{
 $schema = [DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
 Switch ($Action)
  {
   "classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name 
             }
   "Mandatory" 
             {
              "Mandatory Properties of $class object"
              ($schema.FindClass("$class")).MandatoryProperties | 
               Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Optional" 
             {
              "Optional Properties of $class object"


              "This might take a few seconds ..."
              ($schema.FindClass("$class")).OptionalProperties | 
              Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Find" 
             {
              $schema.FindAllClasses() | 
              Where-Object { $_.name -match "$class" } |
              Select-Object -property name
             }
   DEFAULT {"$action is not a valid action." ; GetHelp ; Exit}
  }
} #end GetADSchema

Function GetAllClasses()
{
 GetAdSchema("classes")
} #end GetAllClasses

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory"  -class $class 
} #end GetMandatory

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses
# *** Entry Point to Script ***
if($help) { GetHelp ; Exit }

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

正如您所看到该脚本开头参数语句。 它用于创建三个命令行参数,允许您通过运行而不是需编辑脚本以看到不同非常有用的行为,但,修改该脚本:

Param($action,$class, [switch]$help)

如果是例如您希望查看 Active Directory 域服务 (AD DS) 中的 User 类的必需属性,与也可以指定 –action M 和在 –class 用户中显示 图 2 .

fig02.gif

图 2 查看 User 类的必需属性

可以只是为轻松地选择组类的可选属性。 这是使用命令行参数的优点: 您可以在不必回到将图形板的运行时修改脚本的行为。 这是最佳做法是,编写脚本要作为实用工具而不是与您将使用一次使用时。

提供帮助

图 1 中脚本的在下一部分显示 GetHelp 函数。 编写命令行参数的脚本时,时最好包含将显示有关使用脚本的函数。 您不希望您的脚本的用户必须打开它,并阅读通过所有文本以确定它的作用。 true,脚本设计的指导原则是,脚本应为可读,但如果包括一个帮助函数,您方便生命周期的用户。

该 GetHelp 函数信息中显示很多与 Get-帮助 cmdlet 相同的方式。 显示文本的三个部分: 说明、 参数和语法。 GetHelp 执行两种操作。 它包含的文本显示,此字符串,然后它显示包含以下的字符串变量的内容 (在本例是 $ helpText)。

下面的字符串是允许您键入的信息,并设置您的输出格式而不必担心引用规则的一种 Windows PowerShell 构造。 下面的字符串中键入的所有内容将被视为文本。 时该脚本是使用 –help 开关运行或如果有人键入不正确的参数,将调用 GetHelp。 图 3 显示了调用使用 –help 开关脚本的结果。

fig03.gif

图 3 调用的 the–help 脚本切换

Nitty-Gritty

现在我们有 GetAD­schema 函数) 执行大部分 图 1 中脚本将实际工作的。 此密钥使用 DirectoryServices.ActiveDir­ectory.ActiveDirectorySchema Microsoft.NET Framework 类。 通过使用双冒号方括号中,并按照的放置类,您可以访问 (在此种情况下,GetSchema 和 get­CurrentSchema) 类的静态的方法。

GetCurrent­schema 静态方法返回 Active­DirectorySchema 类,代表您当前连接到该架构的一个实例。 图 4 显示了 ActiveDirectorySchema 类成员。

fig04.gif

在创建 DirectoryServices.ActiveDirectory.ac­tive­schema.NET Framework 类和存储的一个实例后生成的架构对象,在 $ 架构变量中您必须决定要执行的操作。 为此,switch 语句计算从 $ 操作变量传递给它的值。

根据条件得到满足,函数将在 AD DS 中找到所有类、 显示特定的类的必需或可选属性或搜索满足的类在给定条件。 使用的开关时最好始终包括默认情况下。

Helper 函数

要分解的一些代码,并使它易于扩展脚本,我已包括大量调用的函数根据传递给脚本运行时将使用的参数的帮助。 每个帮助器函数将调用 GetADSchema,并传递一组不同的根据为 –Action 参数从命令行提供的值的参数。

在第一个的 Helper 函数是 GetAllClasses,它调用 GetADSchema 并将该单词"类"。 当 switch 语句 GetAD­schema 函数中的匹配字符串"类"时, 它将从 ActiveDirectorySchema 类调用 FindAllClasses 方法。 下面是由 switch 语句调用的代码:

"classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name'

并如下 GetAllClasses 函数:

Function GetAllClasses()
{
GetADSchema("classes")
} #end GetAllClasses

在下一个的 Helper 函数是对象的的 GetMandatory,其目的是对象的返回在运行该脚本时,指 –class 参数中的必需属性。 GetMandatory 函数从命令行通过 –class 参数接收 $ 类的值。 GetMandatory 调用 GetADSchema 函数时, 它将传递两个参数。 由于两个参数传递,我考虑它最好指定完整的参数名都,使代码更易于阅读和理解。 相反,在 GetAllClasses 函数中我们未使用 –Action 参数名调用 GetADSchema 函数时。 在这种情况下定位的方式被传递值"类"。

调用 GetADSchema 函数时, 使用 FindClass 方法从 ActiveDirectorySchema 类来检索 $ 类变量中指定的类。 它将返回一个 ActiveDirectorySchemaClass 类的一个实例。 此类的成员 图 5 所示。

fig05.gif

GetADSchema 函数接下来查询对象的 MandatoryProperties 属性并管道结果,该位置选择名称、 语法和 IsSingleValued 属性下的 Format-Table cmdlet。 Format-Table cmdlet 的 –Autosize 切换参数自动调整大小以避免尽可能缩短关闭属性值的列。 "必需"字符串相匹配时运行的代码所示:

"Mandatory" 
       {
       "Mandatory Properties of $class object"
       ($schema.FindClass("$class")).MandatoryProperties | 
       Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
       }

并如下 GetMandatory 函数:

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory" -class $class 
} #end GetMandatory

现在让我们看一下 get­optional 函数可以显示 AD DS 类的可选属性的方式。 GetOptional 接受收到从命令行通过该 –class 参数的 $ 类值,然后它将 $ 类值传递给 GetADSchema 函数以及与名为"可选"的操作。

switch 语句中匹配字符串"可选",以解释显示可选属性可能需要几秒钟时间一条消息打印到屏幕。 然后,调用从 ActiveDirectorySchema 类在 FindClass 方法。 在 FindClass 方法返回 ActiveDirectory­SchemaClass 类的一个实例。 如果您打算查询 ActiveDirectorySchema­class 类的 optional­properties 属性,则会返回为在 AD DS 中所选的类定义的可选属性。

结果被 pipelined 到 Format-Table cmdlet 的必需属性一样,以相同方式显示信息。 下面是这一部分代码:

"Optional" 
      {
      "Optional Properties of $class object"
      "This might take a few seconds ..."
      ($schema.FindClass("$class")).OptionalProperties | 
      Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
      }

下面的代码是完整的 GetOptional 函数:

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

最终的帮助作用是 FindClasses,它调用 GetADSchema 函数并传递两个值。 第一个是操作查找,第二个类来定位。 此功能旨在帮助用户确定可能 merit 进一步探索的 AD DS 架构中的类。

假设您是想使用电子邮件。 在这种情况下想要查看的类与电子邮件,然后哪些属性存在适用的类。 如 图 6 所示首次运行该脚本使用 –action f,和 –class 邮件参数。 这会返回有字符串"邮件"包含在名称中的某处的所有类。 找到您感兴趣的类之后,您浏览选择操作 m (用于强制),并指定该 –c 类) 的参数类的属性跟的确切名称类。

fig06.gif

图 6 查找在 AD DS 架构中的一个类

FindClasses 函数调用,GetADSchema 时, 调用该 FindAllClasses 方法,并通过管道发送的 ActiveDirectorySchemaClass 类生成的集合。 位置的对象使用正则表达式模式匹配来查找与存储在 $ 类变量的值匹配的类。 下面的代码:

"Find" 
    {
    $schema.FindAllClasses() | 
    Where-Object { $_.name -match "$class" } |
    Select-Object -property name

这是 FindClasses 函数:

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses

定义所有帮助器函数后,您到达入口点给脚本。 入口点不会只有一件事情,它检查命令行,并确定要调用哪个函数。 第一次一点就是选中是 –Help 参数的存在。 如果该脚本运行 –h 或 –Help,则脚本将调用 GetHelp 函数来显示帮助,然后退出,如下所示:

if($help) { GetHelp ; Exit }

因为 –Help 参数查找第一个,其命令行上的存在 trumps 其他任何内容。 如果不使用 –help 参数了该脚本就值必须为 –Action 参数提供的值,这是默认参数。 在命令行上键入的任何内容将被解释为 –action 值如果没有其他使用。 这样使输入到脚本的 Bogus 捕获的添加的利用。

switch 语句是一个自然的工具,评估为 –action 提供的值。 四个操作定义,每个调用相应的函数。 第五个的条件,定义均默认的操作,然后 whereupon 它将调用 GetHelp 函数显示一条消息,操作不允许使用。

要记住有关开关语句是它找到多个匹配项。 对于由于这个原因,退出语句使用函数的每个调用之后。 切换语句代码所示:

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

好,关于它的朋友们。 没有 ADSI Scriptomatic 以外的其他任何 Active Directory 浏览器。 但 BrowseActive­DirectorySchema.ps1 脚本应为您服务用于时间被。 脚本有趣的多个 Active Directory,请访问, Active Directory 的脚本中心. 并且您知道我们打开年度的每一时刻在该 脚本中心.

Ed Wilson 是在 Microsoft 和已知的脚本专家的一名高级顾问。 他是一个 Microsoft 认证培训师,用户将常见的 Windows PowerShell Workshop 传递给 Microsoft Premier 客户全球范围内。 他已写入包括几个的 Windows 脚本编写的八个联机,并且他已提供几乎很多其他书籍。 Ed 包含超过 20 个行业认证。

Craig Liebendorfer 是 wordsmith 和 longtime 的 Microsoft Web 编辑器。 Craig 仍 can’t 认为有 ’s 支付他使用单词每天的作业。 他最喜欢的事情之一是 irreverent 幽默,因此他应适合在此处的右侧。 他认为他的最大 accomplishment 为他你的女儿生命周期中。