PowerShell远程操作:像专业人士一样执行远程命令

假设您已经学会了本地执行命令;这已经是掌握远程执行的一个垫脚石。PowerShell 远程处理允许管理员在远程系统上执行命令和脚本。

本指南演示了在 Active Directory (AD) 环境中设置和使用 PowerShell 远程处理。想象一下,您可以在不离开办公桌的情况下远程创建文件、运行脚本或检查配置。

设置和使用 PowerShell 远程处理,以自信地在远程系统上执行脚本!

为标准用户设置 PowerShell 远程处理

在充分利用 PowerShell 远程处理之前,您必须确保具备必要的权限。远程运行命令或脚本依赖于正确的配置,尤其是在安全性优先的 Active Directory 环境中。

首先,尝试使用 Invoke-Command 连接到远程服务器 (SRV2)。以下命令在远程计算机上运行一个脚本块:

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

如果身份验证失败,通常意味着用户缺乏必要的权限。

默认情况下,非管理用户必须是远程计算机本地 远程管理用户 组的成员。

检查组成员资格:

Get-LocalGroupMember -Group 'Remote Management Users'

如果用户不在列表中,请将其添加:

Add-LocalGroupMember -Group 'Remote Management Users' -Member user
Get-LocalGroupMember -Group 'Remote Management Users'

现在,重试 Invoke-Command 命令以确认连接。

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

远程运行基本脚本

一旦配置了 PowerShell 远程管理,您就可以在远程计算机上运行命令。这一功能解锁了自动化任务、收集数据和远程故障排除的潜力。

要查看 PowerShell 远程管理的工作原理,请在远程计算机上创建一个文本文件,然后验证操作是否成功。

定义并执行脚本块:

$scriptblock = { Set-Content -Path 'somefile.txt' -Value '' }
Invoke-Command -Scriptblock $scriptblock -ComputerName SRV2

使用以下命令验证文件是否已创建:

该命令连接到远程计算机 SRV2,检索有关文件 somefile.txt 的信息,并仅输出其名称和创建时间。

icm -ComputerName SRV2 -ScriptBlock {Get-Item somefile.txt} | Select-Object Name, CreationTime

在远程计算机上运行本地脚本

也许单个命令不足以满足需求,您可能需要在本地计算机上运行一个完整的脚本。如果是这样,PowerShell 远程管理让您可以快速将本地脚本发送到远程计算机并像在现场一样执行它。

为了演示如何在远程计算机上运行脚本,请在本地创建一个简短的脚本,并在远程计算机上运行它以自动化操作或清理任务。

使用以下命令在本地创建脚本,其中:

  • $scriptContents 使用多行字符串的 here-string (@' ... '@) 存储脚本,这对于保持脚本可读和组织结构非常有用。
  • Set-Content$scriptContents 的内容写入当前目录中的一个名为 *RunThisRemotely.ps1* 的文件。
$scriptContents =
@'
Write-Host "Deleting the file just created..."
Remove-Item -Path somefile.txt
'@
Set-Content -Path 'RunThisRemotely.ps1' -Value $scriptContents

确认脚本内容:

Get-Content RunThisRemotely.ps1

远程运行脚本:

Invoke-Command -ComputerName SRV2 -FilePath RunThisRemotely.ps1

现在,验证测试文件是否已删除:

icm -ComputerName SRV2 -ScriptBlock {Test-Path somefile.txt}

验证本地注册表项与脚本块

PowerShell 远程处理支持在本地和远程会话之间传递变量,从而实现灵活和可重用的脚本。但首先,让我们重点检查本地的注册表项。

存储多个注册表路径,以便后来检查它们是否存在于系统上:

# Define an array of registry paths to check
$registryKeyPaths = @(
    'HKLM:\SOFTWARE\Microsoft\AppV\', 
    'HKLM:\SOFTWARE\Microsoft\AccountsControl\'
)

将以下内容添加到脚本中,以定义一个在计算机上本地执行的脚本块 ****($localScriptBlock)。该脚本块检查特定的注册表路径是否存在于本地计算机上,并为每个路径提供反馈。

# Define the script block that will run locally on the computer
$localScriptBlock = {
    ## Iterate through each registry path in the $registryKeyPaths array
    foreach ($path in $registryKeyPaths) {
        # Check if the current registry path exists on the local machine
        if (Test-Path -Path $path) {
            # If the path exists, output a message confirming its existence
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            # If the path does not exist, output a message stating its absence
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

执行脚本块,看看会发生什么。

Invoke-Command -ScriptBlock $localScriptBlock

将本地变量传递到远程会话

无论您是在处理数组、字符串还是对象,都可以通过两种方式将数据传递给远程命令:

  • $using – 直接将本地变量集成到脚本块中。
  • ArgumentList – 显式地将变量传递给脚本块以供使用。

继续阅读,探索这两种方法($usingArgumentList)以实现此目标。

使用 $using 关键字(首选方法)

在确认注册表项存在后,下一步是本地读取该数组并在远程计算机上的脚本中使用它。实现这一目标的一个方法是使用$using关键字在远程会话中引用本地变量。

创建这个脚本以在远程计算机上运行并检查指定的注册表路径。该脚本提供关于每个路径是否存在的反馈。

通过这种方法,您只需在本地变量前面添加$using前缀。这一操作告诉PowerShell在远程计算机执行代码之前引用本地变量registryKeyPaths

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $using:registryKeyPaths) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

然后,您可以调用远程命令在远程机器上执行代码:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2

看起来那里也存在注册表项。

使用ArgumentList参数

除了$user关键字,另一个选项是ArgumentList参数,用于将变量发送到远程会话。

创建一个脚本(类似于使用$using关键字的脚本),使用$args数组访问通过ArgumentList参数传递的值。

在这种方法中,您指定一个或多个变量通过ArgumentList参数发送到远程会话。在脚本块内部,用$args替换本地变量,PowerShell将自动用通过ArgumentList传递的值填充它。

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $args) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

现在,使用以下命令执行脚本:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2 -ArgumentList $registryKeyPaths

这两种方法都会产生相同的输出,确认远程计算机上的注册表项存在。

通过遵循这些步骤,您可以有效地设置和使用 PowerShell 远程处理在远程系统上运行命令和脚本。

结论

在本教程中,您学习了如何在 Active Directory 环境中设置 PowerShell 远程处理,在远程系统上运行命令和脚本,以及有效地传递变量。这些基础技能对于自动化管理任务和高效管理系统至关重要。

现在您已经掌握了基础知识,可以考虑探索更高级的主题。研究持久的 PowerShell 会话、处理远程错误或创建可重用的脚本以处理批量操作。

PowerShell 远程处理的可能性是无穷无尽的——所以开始实验,让您的工作流程更高效吧!

Source:
https://adamtheautomator.com/powershell-remoting-guide/