PowerShell 技能连载 - 锁定工作站
如果您希望在 PowerShell 中锁定当前工作站,您可以利用 PowerShell 可以运行可执行程序的特性。以下是一个使用 rundll32.exe
来调用一个 Windows 内部函数来锁定工作站的快速函数:
1 | function Lock-Workstation |
如果您希望在 PowerShell 中锁定当前工作站,您可以利用 PowerShell 可以运行可执行程序的特性。以下是一个使用 rundll32.exe
来调用一个 Windows 内部函数来锁定工作站的快速函数:
1 | function Lock-Workstation |
PowerShell 可以在 WinPE 环境中运行。如果您希望检测 PowerShell 脚本是否运行在 WinPE 员警中,您只需要检查某个注册表键是否存在:
1 | function Test-WinPE |
如果您在 WinPE 环境中运行,这个函数返回 $true
。
PowerShell 提供了新的 cmdlet,例如 Extract-Archive
,可以从一个 ZIP 文件中解压(所有的)文件。然而,只能解压整个压缩包。
如果您希望解压独立的文件,您可以使用 .NET 方法。以下是一个实现的示例:
代码中的注释解释了代码在做什么。只需要确保您调整了初始变量并且制定了一个存在的 ZIP 文件,以及一个在 ZIP 文件中存在的文件扩展名:
1 | #requires -Version 5.0 |
PowerShell 提供了新的 cmdlet,例如 Extract-Archive
,可以从一个 ZIP 文件中解压(所有的)文件。然而,并没有方法列出一个 ZIP 文件中的内容。
要实现这个目的,您可以使用 Extract-Archive
中使用的 .NET 库。这段代码将输入一个 ZIP 文件并提取它的内容(请确保您将 ZIP 的路径改为一个实际存在的路径):
1 | # adjust this to a valid path to a ZIP file |
从 PowerShell 5 开始,您可以为一个变量增加一个验证器。该验证器可以接受一个正则表达式,而且当您向该变量赋值时,该验证其检查新内容是否匹配正则表达式模式。如果不匹配,将会抛出一个异常,而该变量内容保持不变。
以下是一个存储 MAC 地址的变量示例:
1 | [ValidatePattern('^[a-fA-F0-9:]{17}|[a-fA-F0-9]{12}$')][string]$mac = '12:AB:02:33:12:22' |
运行这段代码,然后尝试将一个新的 mac 地址赋值给该变量。如果新的 mac 地址不符合验证器,PowerShell 将抛出一个异常。
默认情况下,PowerShell 在重新运行时会自动“忘记”某些设置。如果您需要“保持”设置,您需要使用 profile 脚本。当 PowerShell 在任何情况下启动时,会运行一段脚本。您可以向该脚本中添加任何命令。
这行代码将会打开当前的 PowerShell profile 脚本,而如果目前该脚本不存在,将会用 notepad 创建一个:
1 | PS C:\> notepad $profile |
您现在可以向 profile 脚本增加这段代码:
1 | "Hello $env:username!" |
您也可以运行这段代码来确保允许 PowerShell 执行本地脚本:
1 | PS C:\> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force |
下一次您运行 PowerShell 时,它将会向您致礼,并且创建一个新的名为 “web
“ 的别名。该别名可以在 Internet Explorer 中打开网页:
1 | PS C:\> web www.powershellmagazine.com |
PowerShell 控制台(powershell.exe、pwsh.exe)提供了可扩展的自动完成支持。当您输入了一个空格和一个连字符,按下 TAB
键将循环切换可用的参数。
Windows PowerShell (powershell.exe) 与 Linux 和 macOS 的 PowerShell (pwsh.exe) 之间有一个巨大的差异。当您在后者中按下 TAB
键,它们将立即显示所有可用的选项,并且您可以选择一个需要的建议。
要为 powershell.exe 添加这个行为,只需要运行这行代码:
1 | PS C:\> Set-PSReadlineOption -EditMode Emacs |
下次当您输入参数的开头部分并按下 TAB
键时,您可以立即见到所有可用的选择。接下来,当重复输入这个命令时,您可以键入选择的首字母,按下 TAB
键即可完成选择。
这时候 Windows 用户可能会听到烦人的警告音。要关闭警告音,请运行:
1 | PS C:\> Set-PSReadlineOption -BellStyle None |
在前一个例子中我们演示了使用早期的 DCOM 协议从远程读取另一台机器的注册表代码。
如果您可以使用 PowerShell 远程处理,情况变得更简单。您现在可以简单地编写在本机可运行的代码,然后将它“发射”到目标机器(支持多台):
1 | # adjust this to a remote computer of your choice |
通过使用 PowerShell 远程处理,您只需要确保 PowerShell 远程处理的先决条件都具备。您可以用这条命令(需要本地管理员特权):
1 | PS C:\> Enable-PSRemoting -SkipNetworkProfileCheck -Force |
如果您无法使用 PowerShell 远程处理,那么您需要通过 DCOM 从另一个系统中读取注册表值,以下是一些您可能希望试验的示例代码:
1 | $ComputerName = 'pc01' |
只需要做一些小改动,该代码就能返回一个 AD 使用的列表
这段示例代码需要:
RemoteRegistry
服务在对方机器上运行当您启用了 ScriptBlockLogging
后,PowerShell 将会记录所有在您机器上执行的所有 PowerShell 代码。如果没有启用它,所有安全相关的代码仍然会记录。这样很不错。然而,该任何用户都可以读取该日志,所以任何人都可以类似这样浏览记录下的代码:
1 | Get-WinEvent -FilterHashtable @{ ProviderName="Microsoft-Windows-PowerShell"; Id = 4104 } |
To harden security and limit the access to the log file, you have two choices:
要强化安全并限制日志文件的读取,您有两个选择:
1 | #requires -RunAsAdministrator |
当您运行该脚本时,读取 PowerShell 操作日志的权限被限制为只有本地管理员。