PowerShell 技能连载 - 管理凭据(第二部分)
对于无人值守运行的脚本,您可以从代码创建登录凭据。这需要将密码以明文的方式存在脚本中(这显然是不安全的,除非您用加密文件系统(EFS)加密您的脚本,或是用其它办法来保护内容):
1 | $password = 'topsecret!' | ConvertTo-SecureString -AsPlainText -Force |
对于无人值守运行的脚本,您可以从代码创建登录凭据。这需要将密码以明文的方式存在脚本中(这显然是不安全的,除非您用加密文件系统(EFS)加密您的脚本,或是用其它办法来保护内容):
1 | $password = 'topsecret!' | ConvertTo-SecureString -AsPlainText -Force |
假设您每天都要运行一个需要凭据的脚本。一个使用强壮凭据的安全方法是将它们保存到一个加密的文件中。这段代码提示输入凭据,然后将它们保存到您桌面上的 XML 文件中:
1 | $credential = Get-Credential -UserName train\user02 -Message 'Please provide credentials' |
密码是以您的身份加密的,所以只有您(并且只能在保存凭据的机器上)能存取该凭据。
以下是读取保存的凭据的代码:
1 | $credential = Import-Clixml -Path "$home\desktop\myCredentials.xml" |
在前一个技能中我们演示了如何用 Select-String
在纯文本中查找指定的词。费了一些功夫通过指定的 pattern 来提取实际的值:
1 | PS C:\> $data = ipconfig | select-string 'IPv4' |
不过这些功夫并不是必要的,因为 Select-String
已经在使用正则表达式来做匹配,然后返回匹配的对象。
1 | PS C:\> ipconfig | |
所以您可以简单地使用 Where-Object
和类似 -like
的操作符来预过滤,识别出只包含感兴趣内容的行(例如只包含 “IPV4” 的行),然后将一个正则表达式 pattern 传给 Select-String
,并计算最终结果:
1 | PS C:\> ipconfig | |
在前一个技能中我们解释了如何使用 Select-String
和正则表达式从纯文本结果中提取有用的信息:
1 | PS C:\> $data = ipconfig | select-string 'IPv4' |
PowerShell 支持 -match
参数,它也能够处理正则表达式。不过它在一行里只能找到一个匹配项。在多数场景中这也不是大问题,因为一行中通常只包含了一个匹配项。您所做的只需要在管道中使用 -match
,则原始的数据会逐行地输入:
1 | PS C:\> ipconfig | |
有些时候,您可能希望从纯文本结果中提取一些有用的信息。一个简单的办法是使用 Select-String
命令。这个例子只提取包含“IPv4”的文本行:
1 | PS C:\> ipconfig | Select-String 'IPv4' |
如果您只对实际的 IP 地址感兴趣,您可以改进这个结果,用正则表达式来提取您感兴趣的部分:
1 | PS C:\> $data = ipconfig | select-string 'IPv4' |
[Regex]::Matches()
输入原始数据和正则表达式 pattern,后者描述了您感兴趣的部分。符合该 pattern 的内容可以在“Value”属性中找到。
在前一个技能中您学到了如何使用 Show-Command
为基于文本的命令创建简单的 UI:
1 | #requires -Version 3.0 |
如果您想调整 UI 中显示的参数的个数,只需要编写您自己的函数即可。
在下面的例子中,Send-MailMessage
被包裹在一个自定义的函数中,并只暴露其中的某些属性,然后在内部初始化其它的属性(例如 SMTP 服务器和凭据)。
以下是一个非常简单的 email 发送函数,只显示发送 email 的文本框:
1 | #requires -Version 3.0 |
函数和 cmdlet 参数是 PowerShell 提供的基础功能,这些文本界面可以轻松地转换成图形界面。
如果您想发送一条消息,您可以使用 Send-MailMessage
并通过文本参数的方式提交细节信息。或者,您可以创建一个图形界面,并将它命名为 Send-MailMessageUI
:
1 | #requires -Version 3.0 |
现在,您可以运行 Send-MailMessageUI
,所有参数都将变成文本框和复选框。甚至不会脚本开发的人现在也能填写这个表单,然后点击“运行”来执行命令。
PowerShell 可以向原有的命令(例如 robocopy)添加值。请看以下的函数——它用 robocopy 来拷贝文件,并且当拷贝完成时,增加了“扁平拷贝”选项来打开目标文件夹:
1 | #requires -Version 3.0 |
这将会把 Windows 文件夹下所有子文件夹中的 log 文件拷贝到名为 c:\\logs
的新文件夹,并且执行扁平化拷贝:
1 | PS> Copy-FileWithRobocopy -Source $env:windir -Destination c:\logs -Filter *.log -FlatCopy -Open |
当您在生产系统使用这段代码之前,请观察 -FlatCopy
是如何工作的:它只是在目标文件夹中查找匹配指定的过滤器,然后将它们移到根目录,最后删除所有文件夹。
所以重复的文件将会被覆盖,而且如果目标文件夹的子文件夹中有其他数据,也会被删除。这是一个很简单的操作,适用于许多情况,但也有很多改进空间。
当您在 PowerShell ISE 中选中一段代码并复制到剪贴板时,它是以 RTF 格式复制的并且保留了所有颜色代码和字体信息。您可以将它粘贴到支持 RTF 的应用程序,例如 Word 中,就可以看到格式化并着色好的 PowerShell 代码。
要调节字体大小,您不能用 PowerShell ISE 右下角的滑块。这个滑块只是改变 PowerShell ISE 中的字体大小,并不会影响复制的代码字体大小。
正确的方法是,在 PowerShell ISE 中,选择工具/选项,然后在选项对话框中调节字体大小。
虽然建议使用更现代的 WPF 技术来创建 PowerShell 用户界面,但您在某些时候仍然会希望使用更早的 WinForms 技术。特别是要在没有安装 .NET framework 3.51 及以上版本的机器上运行时。WinForms 用户界面需要很多代码,而且不是那么直观。
所以这里提供一个免费的 PowerShell 在线图形设计器,可以快速地创建代码: http://www.poshgui.com/