New-ADUser是ActiveDirectory模块中的一个cmdlet,它允许PowerShell用户快速轻松地在您的域中创建新用户。
New-ADUser -Name “John Doe” -GivenName “John” -Surname “Doe” -SamAccountName “jdoe”
这会在您的活动目录林中创建用户 John Doe。
图 3.17 新 ADUser cmdlet 和字段的细分。3.5.1 位置-对象有时,您可能会使用PowerShell来搜索大量数据。例如,您可能要在整个域中搜索特定用户,或者在任何给定字段中具有特定值的用户。例如,您可能希望查询所有网域,以查看哪些用户当前被锁定。根据您的域大小,您可能会搜索数百甚至数万用户。真正有用的是一种让PowerShell过滤所有这些结果的方法,只为你提供你关心的信息。
Where-Object 正是您可以用来执行此操作的工具。
注意通常认为最佳做法是尽可能“向左过滤”。在下面的示例中,我们将过滤器应用于管道右侧以进行演示。这通常会是一个较慢的搜索,因为返回的结果更多,PowerShell 需要使用 Where-Object 进行排序。我们将在接下来的章节中讨论左过滤技术,如何,何时以及为什么使用它们。
图 3.18 Get-ADUser 和 Where-Object cmdlet 细分。表3.1 比较运算符平等 | -情 商 | 左侧的对象与右侧的对象完全匹配 |
喜欢 | -喜欢 | 查找字符串一部分的通配符搜索。例如,“*doe”会找到用户名以doe结尾的任何帐户 |
大于 | -燃气轮机 | 如果左侧的值大于右侧的值,则返回结果。 |
小于 | -lt | 如果左侧的值小于右侧的值,则返回一个值。 |
PowerShell 可以利用许多其他比较运算符示例,我们将在以后的章节中看到更多这些应用。
$_ 这个奇怪的变量是什么?您使用PowerShell的次数越多,您就越会看到仅定义为($_)的奇怪变量。简单地说,$_是一个自动变量。这基本上可以用作“每个实例”的占位符。在此代码中:
Get-ADUser -filter *|Where-Object {$_.SamAccountName -eq “jdoe”}
我们要求PowerShell获取整个域中的每个Active Directory用户。然后,我们希望确保只返回与“jdoe”匹配的单个帐户。但是PowerShell可能会返回数百甚至数万个帐户,当我们返回Active Directory中的每个用户时。
通过包含$_,我们要求PowerShell比较每个实例的SamAccountName并返回等于“jdoe”的实例。
3.6 开始-睡眠有时可能需要一些时间才能执行操作。如果您像我们上面所做的那样查询Active Directory结构,则根据域的大小,可能需要几秒钟甚至一两分钟才能提取所有结果。创建新用户有时可能需要一些时间才能完成。然后,由于该帐户需要跨所有域控制器进行复制,因此所有 Active Directory 客户端可能需要几秒钟才能知道新用户。如果我们要创建一个用户,然后立即查询该用户的活动目录,我们可能会创建所谓的竞争条件。
竞争条件基本上是当两件事同时发生并且您不确定哪件事可能首先完成时。在 PowerShell 从查询中返回用户之前,DC 是否会复制其活动目录?
如果复制速度慢于查询,PowerShell 可能会响应用户不存在。因为当它查询它正在与之通信的域控制器时,用户帐户尚未复制到其数据库。如果管理员只是等待复制完成,他或她将收到不同的答案。
开始-睡眠就像一个暂停按钮。它将脚本置于定时等待状态,在等待您请求的时间量之前,它不会尝试执行下一个命令。
图 3.19 运行中的启动-睡眠 cmdlet3.7 把所有东西放在一起现在我们已经了解了每个组件是如何独立工作的,让我们看看我们如何安排它们来构建我们完成的脚本。
3.7.1 读取主机使用 Read-Host cmdlet,我们提示脚本的操作员输入要在 Active Directory 中创建的用户的名字和姓氏。这允许更动态地使用脚本,因为我们不再需要在运行脚本之前编辑脚本,事先修改变量。现在,运算符在每次运行脚本时都会提供这些值。
因为操作员有可能在他或她输入的值之前或之后点击一个空格,所以我们也利用我们在上一个 Tiny PowerShell 项目中学到的 Trim() 方法来删除每个变量的任何空格。
图 3.20 从 Tiny PowerShell 项目代码读取主机。