尝试使用Powershell自动化流程


本文将通过几个工作示例来说明为什么我们大家都喜欢Powershell。 这在盘点清单,查找特定计算机和其他事项时将非常有用。 Powershell配备了方便易用的cmdlet,所有内容的自动完成和直观的名称使其可能是最容易学习的语言。

在本指南中,我们将看一些作者看来很酷的团队,并解释为什么这很酷。 让我们从片段开始。

有用的摘要:


我们将计算机带到TrustedHosts

通过WinRm连接到服务器时很有用。 该命令将覆盖先前的值,请小心,添加ip或用逗号分隔的主机名。 如果所有主机都位于AD中,则无需触摸此文件。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value '192.168.0.1' 

如果您不想每次都将新主机添加到TrustedHosts,通配符也可以使用。

 Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*' 

我们将密码以加密形式存储在文件中:

它对自动化很有用,它极大地延长了从调度程序运行脚本的寿命,但是密码以安全的形式存储。

如果您从已登录的用户运行脚本,则将使用该用户的信用。

 Read-Host -AsSecureString | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath .\Password.txt 

我们从文件中获取加密的密码:

 $Password = Get-Content C:\Password.txt | ConvertTo-SecureString 

使用凭据可以完成相同的操作,将读取主机替换为Get-Credential。

 Get-Credential | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath .\Credential.txt 

我们获得操作系统的最后启动日期。

 (gcim win32_operatingsystem).LastBootUpTime 

同样,我们也可以正常运行。

 Get-CimInstance Win32_operatingsystem -ComputerName $computers | Select-Object LastBootUpTime, @{Name="Uptime";Expression = {(Get-Date) - $_.LastBootUptime}} 

我们获得已安装程序的列表:

它是程序,而不是组件:

 Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize 


我们获得了驱动器列表,包括网络驱动器及其上的可用空间

 Get-PSDrive -PSProvider filesystem | where-object {$_.used -gt 0} | Select-Object -property Root,@{name="Size";expression={($_.used+$_.free)/1GB -as [int]}}, @{name="Used";expression={($_.used/1GB) -as [int]}}, @{name="Free";expression={($_.free/1GB) -as [int]}} 

我们按其名称停止该过程。

在此示例中,我们停止了Chrome。 如果您想完成所有操作,通配符也适用。

 Get-Process -Name "chrome" | Stop-Process 

将文件夹访问设置复制到子文件夹

如果要选择或授予使用该文件夹以及用户组或用户的所有子文件夹的权限,这将很有用。 该命令从下到上以递归方式读取和写入权限。

从文件夹复制ACL:

 $Acl = Get-Acl -Path C:\folder\ 

在所有文件和子文件夹上插入ACL:

 Get-ChildItem -Path C:\Folder\ -Recurse | Set-Acl $Acl 

有用的脚本:


这是最糟糕的乐趣开始的地方。 如果您需要盘点,查看一下将非常有用。 如果您的计算机不在AD中,则脚本将变得更加复杂,必须在预编译的文件上进行迭代,并且需要从文件或通过Get-Credential获取密码。 所有区别:

广告:

 $ADComputers = (Get-ADComputer -filter *).DNSHostName 

没有广告:

 $Credentials = Get-Credential $Computers = Get-Content -Path C:\servers.txt 

我们获取正常运行时间是AD中每台计算机的上次启动日期:

 $ADComputers = (Get-ADComputer -filter *).DNSHostName foreach ($i in $ADComputers) { Invoke-Command $i { Get-CimInstance Win32_operatingsystem | Select-Object LastBootUpTime, @{Name="Uptime";Expression = {(Get-Date) - $_.LastBootUptime}} } } 

我们将在所有AD计算机上获取所有已安装的程序:

 $ADComputers = (Get-ADComputer -filter *).DNSHostName foreach ($i in $ADComputers) {    Invoke-Command -computername $i {        gcim win32_product -computername $env:computername | Sort-Object -property Vendor,Name | Select-Object -property Vendor,Name, Caption    } } 

替换Invoke-Command可以获得相同的组件:

 Get-WindowsFeature | Where-Object -Property "Installed" -EQ "Installed" 

我们将在需要的进程运行的地方获得计算机:

如果您忘记了此程序或该程序在哪台计算机上运行,​​则可以通过这种方式获得它。 考虑一个浏览器示例:

 $ADComputers = (Get-ADComputer -filter *).DNSHostName foreach ($i in $ADComputers) {    Invoke-Command -computername $i {        Get-Process -Name "Chrome"  -ErrorAction SilentlyContinue    } } 

杀死浏览器就像获得一个过程一样容易:

 $ADComputers = (Get-ADComputer -filter *).DNSHostName foreach ($i in $ADComputers) {    Invoke-Command -computername $i {        Get-Process -Name "Chrome" | Stop-Process -ErrorAction SilentlyContinue    } } 

我们得到安装了特定程序的计算机:

在这种情况下,秘密地使用Java。 这将在清单编制过程中提供帮助,您可以看到安装清单的计算机的名称。

 $ADComputers = (Get-ADComputer -filter *).DNSHostName foreach ($i in $ADComputers) {    Invoke-Command -computername $i {        gcim win32_product -computername $env:computername | Select-String -Pattern "Java" -AllMatches | Sort-Object -property Vendor,Name | Format-Table -ErrorAction SilentlyContinue    } } 

如果您有任何建议,我们很高兴将其添加到本文中。 我们希望这些示例对您有用。

我们提供了已更新的UltraLite Windows VDS关税,已安装Windows Server 2019 Core的价格为99卢布。

Source: https://habr.com/ru/post/zh-CN483416/


All Articles