PowerShell 技能连载 - Windows 重启后自动登录
如果您的自动化脚本需要重新启动机器,并且您希望在重新启动后自动登录,那么以下是一个快速的脚本,它将登录凭据保存到 Windows 注册表:
1 | # ask for logon credentials: |
如果您希望每次计算机启动时自动登录,那么可以使用相同的方法。
显然,此技术可能会增加安全风险:密码以明文的方式写入注册表。请只在合适的地方谨慎使用它。
PowerShell 技能连载 - Windows 重启后自动登录
如果您的自动化脚本需要重新启动机器,并且您希望在重新启动后自动登录,那么以下是一个快速的脚本,它将登录凭据保存到 Windows 注册表:
1 | # ask for logon credentials: |
如果您希望每次计算机启动时自动登录,那么可以使用相同的方法。
显然,此技术可能会增加安全风险:密码以明文的方式写入注册表。请只在合适的地方谨慎使用它。
PowerShell 技能连载 - 自动化下载联想驱动程序(第 2 部分)
在前面的示例中,我们说明了如何从 Web 抓取联想驱动程序信息。在此示例中,返回的一些信息是原始数字信息:例如,表示 “3” 表示需要重启。
在这个技能中,我们想展示如何幻数 (cryptic numeric values) 转换为友好的文本。首先,让我们来看看改进的 Lenovo 函数:
1 | function Get-LenovoDriver |
您现在可以通过以下方式获取有关任何 Lenovo 机器的任何驱动程序更新的信息:
1 | PS C:\> Get-LenovoDriver -Model 20JN -Os Win10 | Out-GridView -PassThru |
属性 “Reboot“ 显示原始的幻数。 新属性 ““RebootFriendly”“ 则用友好的文本表示,在这个例子中是 “Forced restart”。
让我们解读一下源代码来了解转换的过程。
对于任何转换过程,您需要准备一个哈希表,该表将幻数映射到友好的文本:
1 | $restartText = @{ |
接下来,将数值转换为文本,与查找哈希表值一样简单:
1 | ... |
PowerShell 技能连载 - 自动化下载联想驱动程序(第 1 部分)
许多硬件供应商提供基于 Web 的自助服务门户。以下是 Lenovo 返回有关驱动程序和其他更新下载的详细信息的示例:
https://download.lenovo.com/cdrt/tools/drivermatrix/dm.html
如果您需要管理成百上千台机器或需要定期查找信息,您当然希望自动化此资源。典型的第一种方法是检查 HTML 源代码并搜索 Web 服务,或者如果一切都失败了,则使用 Invoke-RestMethod 和 session cookie 来发送表单数据并模仿用户输入。
这不仅复杂,甚至可能完全失败。例如,Lenovo 网站使用 Javascript 编写 Web 前端,因此 PowerShell 和 Invoke-RestMethod 此时起不了作用。您必须使用基于 Selenium 的测试浏览器或其他高级 Web 浏览器自动化。
但是,当您仔细查看 HTML 源代码时,您可能会遇到这样的代码:
1 | $.get("../../../catalog/" + x + "_" + document.getElementById("os").value + ".xml", function(data, status) |
显然,网站上显示的数据来自静态 XML 文件,因此实际上不需要对 Web 界面进行自动化操作。在这种情况下,您只需要知道这些 XML 文件的命名方式。
这是包装这些 XML 文档的 PowerShell 函数。它返回所有型号的 Lenovo 驱动程序信息,并且是完全自动化的:
1 | function Get-LenovoDriver |
您现在可以直接从 PowerShell 命令行检索信息,而不是手动操作 HTML 页面,例如:
1 | PS> Get-LenovoDriver -Model 20JN -Os Win10 | Out-GridView -PassThru |
即使您不管理 Lenovo 硬件,您也可以复用此示例中介绍的一些技术。
PowerShell 技能连载 - Out-GridView 自定义列
当您使用 -OutputMode 或 -PassThru 参数时,Out-GridView 可以是一个通用对话框。执行此操作时,网格视图窗口会在其右下角显示其他按钮,以便您可以选择项目并将它们传递给其他 cmdlet。
此行代码可以帮助选择要停止的服务,例如:
1 | Get-Service | Where-Object CanStop | Out-GridView -Title 'Service to stop?' -OutputMode Single | Stop-Service -WhatIf |
但是,Out-GridView 无法控制它显示的属性。在上面的示例中,用户实际上只需要查看服务名称以及可能的依赖服务。
当然,您可以使用 Select-Object 来选择要显示的属性。现在网格视图窗口将准确显示您要求的列,但由于您永久删除了所有其他属性并更改了对象类型,后续 cmdlet 可能会如你所想的不能正常工作:
1 | Get-Service | Where-Object CanStop | Select-Object -Property DisplayName, DependentServices | Out-GridView -Title 'Service to stop?' -OutputMode Single | Stop-Service -WhatIf |
运行上面这行代码时,网格视图窗口现在看起来很棒,但 Stop-Service 将不再停止选择您选择的服务,因为 Select-Object 将对象类型从 Service 更改为自定义对象:
Stop-Service : The specified wildcard character pattern is not valid: @{DisplayName=Windows Audio Endpoint Builder;
DependentServices=System.ServiceProcess.ServiceController[]}
在上一个技能中,我们已经使用了一种隐藏的技术,您可以使用它来告诉 Out-GridView 它应该显示哪些列——无需删除任何属性或更改对象类型:
1 | # create object that tells PowerShell which column(s) should be visible: |
不幸的是,当您这样做时,您可能会遇到红色错误消息。某些 PowerShell 对象(例如 Service)已经使用了我们尝试添加的巧妙技巧,因此您无法覆盖 PSStandardMembers 属性。要解决此问题,只需通过 Select-Object * 运行它们来克隆对象:
1 | # create object that tells PowerShell which column(s) should be visible: |
现在一切都很神奇,Out-GridView 仅显示您选择的属性。尽管如此,Stop-Process 继续获得输出信息并停止您选择的服务(删除 -WhatIf 来真实地停止服务,请确保您有管理员权限进行此操作)。
虽然通过 Select-Object 运行对象确实会更改其对象类型,但大多数 cmdlet 仍会继续处理这些对象,因为它们仍包含所有属性。这是最后一个示例:即使 Out-GridView 仅显示您选择的属性,对象仍包含所有属性,包括隐藏在网格视图窗口中的属性:
1 | # create object that tells PowerShell which column(s) should be visible: |
PowerShell 技能连载 - 修复 PowerShellGet 和 Publish-Module
Publish-Module 是一个 cmdlet,用于将模块发布(上传)到 NuGet 仓库。有时,此 cmdlet 会引发奇怪的异常。这种情况下的原因是 nuget.exe 的过时版本。该应用程序负责打包一个模块并保存为.nupkg 文件,并且在您第一次使用 Publish-Module 时会自动下载该应用程序。
要更正此问题并刷新您的 nuget.exe 版本,请运行以下命令:
1 | Invoke-WebRequest -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$env:LOCALAPPDATA\Microsoft\Windows\PowerShell\PowerShellGet\NuGet.exe" |
确保在此之后关闭并重新启动所有 PowerShell 会话。如果 Publish-Module 仍然拒绝工作,您可能需要运行以下命令(需要管理员权限):
1 | Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force |
下面的代码检测是否有挂起的重启:
1 | $rebootRequired = Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending" |
寻求保护隐私吗?这是一个简短的脚本,用于在您的系统上查找已启用的摄像头,并让您禁用任何不想使用的摄像头:
1 | # find working cameras |
PowerShell 技能连载 - 使用 SOAP Webservice
尽管 SOAP 尚未广泛用于公共的 Webservice(通常使用更简单的 REST 服务),但在内部,许多公司确实将 SOAP 用于他们的 Webservice。
PowerShell 具有出色的 SOAP 支持,因此您无需大量复杂的代码即可连接和使用 SOAP Webservice。这是少数剩余的免费公共 SOAP Webservice 之一(将德语“bankleitzahl”翻译成银行详细信息):
1 | $o = New-WebServiceProxy -Uri http://www.thomas-bayer.com/axis2/services/BLZService?wsdl |
如您所见,要开始使用 SOAP Webservice,您需要 Webservice 提供的 WSDL URL。此网页以 XML 格式返回整个接口定义,New-WebServiceProxy 根据此信息创建包装 SOAP 数据类型所需的所有代码。
一旦您可以访问(任何)SOAP Webservice,您就可以使用以下代码来检查其方法:
1 | $o = New-WebServiceProxy -Uri http://www.thomas-bayer.com/axis2/services/BLZService?wsdl |
PowerShell 技能连载 - 通过 PowerShell 调用 COVID 服务
您想及时了解 Covid 疫情数据吗?试试这个简单的 webservice:
1 | $result = Invoke-RestMethod -Uri "https://coronavirus-19-api.herokuapp.com/countries" |
结果类似于:
country : Germany
cases : 4480066
todayCases : 0
deaths : 95794
todayDeaths : 0
recovered : 4215200
active : 169072
critical : 1336
casesPerOneMillion : 53248
deathsPerOneMillion : 1139
totalTests : 73348901
testsPerOneMillion : 871788
PowerShell 技能连载 - 启用 Active Directory cmdlet
在服务器和客户端上,Windows 都附带了 “ActiveDirectory” PowerShell 模块。它添加了许多 cmdlet 来管理 Active Directory 中的用户和资源。
默认情况下,该模块是隐藏的。要在客户端上启用它,请以管理员权限运行:
1 | $element = Get-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS*" |
在服务器上,再次使用管理员权限并运行:
1 | Install-WindowsFeature RSAT-AD-PowerShell |