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는 스크립트를 다중 행 문자열로 저장하며, 이는 스크립트를 읽기 쉽고 정리된 형태로 유지하는 데 유용합니다(@' ... '@).
  • 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}

Scripblock를 사용하여 로컬 레지스트리 키 확인

PowerShell Remoting은 로컬 및 원격 세션 간에 변수 전달을 지원하여 유연하고 재사용 가능한 스크립트를 만들 수 있습니다. 그러나 먼저 로컬에서 레지스트리 키를 확인하는 데 초점을 맞추어봅시다.

나중에 확인할 수 있는 여러 레지스트리 경로를 저장하세요. 시스템에서 해당 경로가 존재하는지 확인합니다.

# 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 – 사용할 변수를 명시적으로 블록에 전달합니다.

이 목표를 달성하는 두 가지 방법($using 또는 ArgumentList)을 살펴보세요.

$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 매개변수 사용

$using 키워드와 유사한 스크립트를 작성하는 데 사용되는 또 다른 옵션은 ArgumentList 매개변수를 사용하여 변수를 원격 세션으로 전송하는 것입니다.

ArgumentList 매개변수를 통해 전달된 값을 액세스하기 위해 $args 배열을 사용하는 $using 키워드를 사용하는 스크립트와 유사한 스크립트를 작성하세요.

이 방법에서는 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 Remoting을 효과적으로 설정하고 사용하여 원격 시스템에서 명령 및 스크립트를 실행할 수 있습니다.

결론

이 튜토리얼에서는 Active Directory 환경에서 PowerShell Remoting을 설정하고, 원격 시스템에서 명령 및 스크립트를 실행하고 변수를 효과적으로 전달하는 방법을 배웠습니다. 이러한 기본적인 기술은 관리 작업을 자동화하고 시스템을 효율적으로 관리하는 데 필수적입니다.

기본 사항을 익혔으므로 더 고급 주제를 탐색해보세요. 지속적인 PowerShell 세션, 원격 오류 처리, 대량 작업 처리용 재사용 가능한 스크립트 등을 살펴보세요.

PowerShell Remoting으로 할 수 있는 것은 무한합니다. 따라서 실험을 시작하여 워크플로를 더 효율적으로 만드세요!

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