PowerShell 技能连载 - 用 Out-GridView 启用 AD 用户
有些时候在 PowerShell 中只需要几行代码就可以创造出很有用的支持工具。以下是一个显示所有禁用的 AD 用户的例子。您可以选择一个(或按住 CTRL 键选择多个),然后点击 OK,这些用户将会被启用:
1 | #requires -Version 3.0 -Modules ActiveDirectory |
有些时候在 PowerShell 中只需要几行代码就可以创造出很有用的支持工具。以下是一个显示所有禁用的 AD 用户的例子。您可以选择一个(或按住 CTRL 键选择多个),然后点击 OK,这些用户将会被启用:
1 | #requires -Version 3.0 -Modules ActiveDirectory |
有些时候从一个指定的 AD 用户读取所有属性到一个哈希表中十分有用。通过这种方法,您可以编辑他们,并使用 Set-ADUser
和它的 -Add
或 -Replace
参数将他们应用于另一个用户账户。
以下是将所有 AD 用户属性读到一个哈希表中的方法:
1 | #requires -Version 3.0 -Modules ActiveDirectory |
请注意 $blacklist
的使用:这个列表可以包含任何希望排除的属性名。
在前一个技能中我们演示了 Get-FolderStructureWithPermission
如何以结构化的形式记录并创建一个包含所有嵌套文件夹的清单,包含它们各自的 NTFS 安全设置。结果可以保存到一个变量中,或用 Export-Csv
序列化后保存到磁盘中。
今天我们演示第二部分:当您拥有一个指定文件夹结构的信息之后,可以使用这个 Set-FolderStructureWithPermission
。它输入一个要克隆其结构的文件夹路径,加上通过 Get-FolderStructureWithPermission
获得的结构信息:
1 | #requires -RunAsAdministrator |
由于设置 NTFS 权限的需要,这个函数需要管理员特权才能运行。
免责声明:这里呈现的所有代码仅供学习使用。由于我们没有投入大量精力去测试它,所以没有任何保障,而且它并不是生产准备就绪的代码。您有责任对这段代码进行测试,并决定它是否完美符合您的需要。
一个典型的用例是克隆一个现有的文件夹结构:
1 | # clone user profile |
有些时候您需要重新创建一个嵌套的文件夹结构,并且希望克隆 NTFS 权限。今天我们我们专注第一个步骤:记录一个已有的文件夹结构,包括 SDDL 格式的 NTFS 权限。
我们可以用 Get-FolderStructureWithPermission
函数实现这个任务。它输入一个已存在文件夹的路径,并返回所有子文件夹,包括 SDDL 格式的 NTFS 权限:
1 | function Get-FolderStructureWithPermission |
您可以将结果通过管道输出到 Out-GridView
,或将它保存到一个变量,或用 Export-Csv
将它写到磁盘中。
1 | PS C:\> Get-FolderStructureWithPermission -Path $home | Format-List |
免责声明:这里呈现的所有代码仅供学习使用。由于我们没有投入大量精力去测试它,所以没有任何保障,而且它并不是生产准备就绪的代码。您有责任对这段代码进行测试,并决定它是否完美符合您的需要。
在 PowerShell 中运行控制台应用程序的迷你系列的第三部分中,有一个小课题:如何独立于 PowerShell 运行一个控制台应用程序,并且当它执行完成后得到通知,并且获取它的 exit code?
以下是实现方法:以下代码在一个独立(隐藏)的窗口中运行 ping.exe。PowerShell 继续运行并且可以执行任何其它操作。在这个例子中,它在 ping.exe 正忙于 ping 一个主机名的同时打出一系列“点”号。
当 exe 执行完成时,这段代码能获取进程的 ExitCode 信息:
1 | $hostname = 'powershellmagazine.com' |
当您直接启动一个控制台应用程序时,PowerShell 会返回它的 exit code(也叫做 Error Level),并存储在 $LASTEXITCODE
变量中。然而,如何获取通过 Start-Process
启动的控制台应用程序的 exit code 呢?
以下是方法:
1 | $hostname = 'powershellmagazine.com' |
当运行一个控制台应用程序时,它通常会返回一个数字型的 exit code。该 exit code 的含义取决于控制台应用程序,要查询应用程序才能理解 exit code 的含义。PowerShell 也会将 exit code 传递给用户。它通过 $LASTEXITCODE
体现。
以下是一个使用 ping.exe 来测试网络响应的例子:
1 | $hostname = 'powershellmagazine.com' |
以下是一个用 WMI 弹出 CD 驱动器的小函数。它首先向 WMI 请求所有的 CD 驱动器,然后使用 explorer 对象模型导航到该驱动器并调用它的 “Eject” 上下文菜单项。
1 | function Eject-CD |
当使用 Import-Csv
导入一个 CSV 文件,需要指定一个分隔符。如果用错了,显然会导入失败。您需要事先知道 CSV 文件使用的分隔符。
以下是一个简单的实践,展示了如何判断一个给定的 CSV 文件的分隔符:
1 | function Get-CsvDelimiter($Path) |
以下是一个测试:
1 | PS> Get-Date | Export-Csv -Path $env:temp\test.csv -NoTypeInformation |
当一个 CSV 文件包含重复的表头时,它无法被导入。在前一个技能中我们掩饰了如何检测一个 CSV 文件中重复的表头。以下是一个自动更正重复项的实践。
第一步,您需要一个包含重复表头的 CSV 文件。例如在德文系统中,您可以这样创建一个文件:
1 | PS C:\> driverquery /V /FO CSV | Set-Content -Path $env:temp\test.csv -Encoding UTF8 |
快速打开该文件并检查它是否确实包含重复项。
1 | PS C:\> notepad $env:temp\test.csv |
如果没有重复项,请将某些表头重命名以制造一些重复项,并保存文件。
您现在可以用 Import-Csv
导入 CSV 文件了:
1 | PS C:\> Import-Csv -Path $env:temp\test.csv -Delimiter ',' |
这是一个新的名为 Import-CsvWithoutDuplicate
的函数,可以自动处理重复的项:
1 | function Import-CsvWithDuplicate($Path, $Delimiter=',', $Encoding='UTF8') |
通过它,您可以安全地导入 CSV 文件,不会遇到重复的表头:
1 | PS C:\> Import-CsvWithDuplicate -Path $env:temp\test.csv -Delimiter ',' |
如您所见,这个函数自动将第二个 “Status” 实例重命名为 “Status1”。