Windows PowerShell 自动执行用户提供,部件 4

Don Jones

内容

输入决定
填充组
其他属性
进一步执行它
某些最终的想法

这是在其中我已经介绍您如何设置 Active Directory 中的新用户的过程自动化的四部分系列的结论。 到目前为止,我已说明了如何创建 Active Directory 帐户的新用户,创建它们的主文件夹,并给这些主文件夹中的权限。 现在,我需要将用户添加到某些域组,并更新几个目录属性。

若要快速地刷新内存,我使用"主 Function"协调所有这些努力,我此系列第 1 部分中所述的。 主函数如下所示:

Function Provision {
  PROCESS {
    CreateUser $_
    CreateHomeFolder $_
    AddToGroups $_
    UpdateAttributes $_
  }
}

在部分 2 系列、 我创建该 CreateUser 函数和第 3 部分中,我介绍 CreateHomeFolder 函数。 本月,我将处理,AddToGroups 和 UpdateAttributes 函数。

输入决定

全部四个我函数获取哈希表包含用户属性。 1,部分中的我原始示例从逗号分隔值 (CSV) 文件中读取这些属性。 在时间,我未进入更深度在我计划传达哪些域组用户应添加到。 有很多我可以可能这样做的方法。 例如,我可以有我的 CSV 文件包含名为组的一列,并填充的类似的名称的某些分隔列表的列:

"Domain Users,Sales,Marketing,East"

或者,我未能为每个组 CSV 中有单独的列并将然后对数据行放 1 用户应属于组和组的 0 我不希望属于用户时。 它可能示在 CSV 中:

Domain Users,Sales,Marketing,East
1,1,0,0
1,0,1,1

我怀疑第二种方法可能是较低的技术人员 (也许是人人力资源部门中) 更容易使用,因为它看起来有些更像一个检查表。 这也是一些可以轻松地创建 Microsoft Access 表或 Microsoft Excel 电子表格中,然后导出到一个 CSV 文件保留这种格式。 因此例如,我将使用第二个布局。

与为"其他属性,"我将继续假定这些来自该 CSV 文件中的特定列。 例如,如果我想让我们然后填充该 postalCode 属性假设我已经相应的列标纳入该 CSV 文件并我导入函数我讨论此系列第 1 部分) 读取到与其他列一起哈希表列。

这意味着我哈希表可能包含类似 $ userinfo [域用户],这将为 1,如果我希望用户属于的组。 哈希表,也可能具有适当的值,每个新用户的包含 $ userinfo [postalCode]。

填充组

我 AddToGroups 函数需要满足的每个可能组,可能会列出我输入文件中。 我基本上只将要检查每个组查看此用户有 1 或 0,以及将如果用户具有 1,然后我将用户添加到组。 由于编号 0 是与布尔值 false 通常意思不同,任何内容时不为零 (如 1) 是与 True,将进行比较相当容易的意思不同。 因此,函数如下所示:

Function AddToGroup {
  Param($userinfo)
  If ($userinfo['Sales']) { Add-QADGroupMember 
    -identity 'DOMAIN\Sales' '
    -member ('DOMAIN\'+$userinfo
     ['samAccountName']) }
  If ($userinfo['East]) { Add-QADGroupMember 
    -identity 'DOMAIN\East' '
    -member ('DOMAIN\'+$userinfo
     ['samAccountName']) }
  If ($userinfo['Marketing]) { Add-
    QADGroupMember 
    -identity 'DOMAIN\Marketing' 
    -member ('DOMAIN\'+$userinfo
     ['samAccountName']) }
}

等。 请记住我们仍使用从可用的在寻找 AD Cmdlet www.Quest.com/powershell.

所有这些重复的代码错误。 我认为我想要执行哪些内容而是创建可能的组名称的数组和然后枚举该数组。 通过这种方式,添加和移除组在以后不会要求我将代码复制并粘贴,我只是必须修改该数组。 现在,函数如下所示:

Function AddToGroup {
  Param($userinfo)
    $groups = 'Sales','Marketing','East'
  Foreach ($group in $groups) {
    If ($userinfo[$group]) { 
      Add-QADGroupMember
        -identity 'DOMAIN\'+$group
        -member ('DOMAIN\'+$userinfo
         ['samAccountName']) }
}
}

有点 leaner 和清洗器,而且它将轻松地适应未来的变化。

其他属性

最后,我需要处理我想要设置的任何其他属性。 这里我将使用相同的方法: 创建允许的属性名称的数组,然后枚举该数组。 在这种情况下我将允许其中一个或多个属性是空白给定的用户的情况如下:

Function UpdateAttributes {
  Param($userinfo)
    $attribs = 'postalCode','title',
      'physicalDeliveryOfficeName'
  Foreach ($attrib in $attribs) {
    If ($userinfo[$attrib] –ne '') {
      $update = @{$attrib=$userinfo
       ['attrib']}
    Set-QADUser
      -identity 'DOMAIN\'+$userinfo
       ['samAccountName'] 
      -objectAttributes $update
    }
  }
}

Set QADUser cmdlet 实际接受 –objectAttributes 参数的哈希表,因此您可能认为我可以只是源它 $ userinfo 哈希表。 但是,我有有,如以便该操作不会工作不 Active Directory 属性名的组名的操作。 此外,我不想发送任何空的属性,因此我希望能够为我做此函数第一次运行通过所有属性,并然后更新实际值的原始的 CSV 文件中的属性。

进一步执行它

有很明显的可以扩展此脚本执行的操作。 这里有几个想到的建议网络日志:

  • 而不是从 CSV 文件中检索信息,您可以从数据库 (如员工数据库) 获取它。 只需替换此系列第 1 部分所述,导入函数。
  • 您可以执行其他配置任务。 只需向主机提供函数添加更多的函数。 请记住,将每个主要任务保留在其自己的从属功能,您将进行内容易于编写、 调试,和维护。
  • 您可以编写出提供活动的日志文件。 例如,您可以使用 out-file 要将文本追加到从属函数中的日志文件。
  • 使用该技术介绍本系列,您可以编写当用户移到公司内其他位置时重新分配组、 权限和 Active Directory 属性 reprovisioning 脚本。

Windows PowerShell 常见问题

问: Microsoft 产品可管理与 Windows PowerShell cmdlet?

A当前,该列表包含 Exchange Server 2007、 System Center Virtual Machine Manager、 系统中心操作管理器和 System Center Data Protection Manager。 SQL Server 2008 还包括一些 Windows PowerShell cmdlet,尽管它们主要针对的 Transact-SQL 语句 (Transact-SQL 在本机脚本语言 SQL Server) 执行。

但没有原因停止存在。 也可以管理 Active Directory 使用可用的一组从 Cmdlet www.Quest.com/powershell; Internet Information Services (IIS) 7.0 的 cmdlet 很开发,并且有甚至 cmdlet 如 VMWare、 IBM WebSphere MQ,等之类的非Microsoft 产品。 可以使用现有的命令行工具可管理如 IIS、 DNS、 DHCP,Windows 防火墙的 Windows 组件以及更多内容。

某些最终的想法

我希望您会发现已完成的脚本和最起码,是有用的起始点,在创建您自己设置脚本其附属的所有函数。 结论的方式,我想提供某些我在做的决定的几个注释。

我选择 hashtables 使用用户信息而不是自定义的对象,因为 hashtables 提供某种程度上更容易可以我不知道提前所有这些属性将是枚举一组属性。 换句话说,hashtables 是有点易于使用和每次运行该脚本,我不可能使用相同的属性时,我知道我将需要添加更多的属性。

我选择使用 Cacls.exe 修改文件夹权限,因为如我所述本系列的第 3 部分,这样做它是比外壳的只是简单 * 的 ACL cmdlet。 此外,使用 Cacls.exe 允许我演示了您可以使用外壳程序变量参数化外部的命令行工具的一种方法。

我选择使用寻找的 Active Directory cmdlet 而不是不是 ADSI,因为 Cmdlet 提供我认为是操作目录 Windows PowerShell 中的一个多本机方法。 ADSI 可以使用的获得认可,并且它会强制您我无法在此示例中使用该命令为中心样式上使用多过程的编程风格。

要对您的脚本作出相同,我希望可以找到这些技术和不同的方法用于解决某些管理的自动化挑战。 我还邀请您共享您的建议和改进与我。 我网站 ConcentratedTech.com 上, 可以找到联系人您发送电子邮件的欢迎页面。 并请确保以便让我知道是否可以共享您的意见 TechNet Magazine 在将来月刊中。

Don Jones 是的创始人 集中的技术每周有关 Windows PowerShell,SQL Server,App V 他博客以及其他主题。 通过他的网站与他联系。