오늘은 Powershell Remote 실행 관련하여 매개변수를 받는 경우 생기는 이슈에 대해 이야기 해보겠습니다.
예를 들어 A서버에서 B서버로 Remote PowerShell 명령어를 사용하여 붙는 경우에는 일반적으로 Invoke-Command를 사용합니다.
Invoke-Command는 ScriptBlock 명령어를 지정한 서버에 실행하게 됩니다.
ScriptBlock의 경우 일반적으로 다음 양식을 따릅니다.
{ "명령어" }
그런데 원격지 서버로 명령어를 수행할때 변수가 사용되는 경우 이슈가 생깁니다.
Invoke-Command 명령어의 경우 Remote 세션을 새로 만들기 때문에 기존에 가지고 있는 Local 세션과 다른 세션이 만들어지므로 변수 값을 인식을 못합니다.
예를 들어
$sb=123
Invoke-Command { Get-ChildItem $sb } -ComputerName B
위와 같은 명령어가 있는 경우
ComputerName B와 연결된 세션에서는 $sb 변수를 인지하지 못하게 됩니다.
그래서 로컬 변수를 원격의 변수로 넣어주기 위해서는 다음과 같은 작업을 진행합니다.
$d = "C:\Test"
$sb = { Get-ChildItem "$using:d" }
Invoke-Command -ScriptBlock $sb -ComputerName B
여기서 using이 로컬 변수를 원격의 새로 생긴 세션에 변수를 가져오는 역할을 합니다.
해당 서버에 호스트네임으로 접속하는 경우에 이슈가 없으나 IP로 접근하는경우
winrm s winrm/config/client '@{TrustedHosts="서버 아이피"}'
를 입력해야합니다.
모든 원격 서버를 승인하기 위해서는 서버 아이피 대신 Remote Computer를 입력합니다.