0

Powershell cmdlet을 원격으로 실행하는 pywinrm 모듈을 얻으려고했습니다. 이것은 내가 지금까지 무엇을 가지고 :pywinrm - 원격으로 New-Mailbox powershell cmdlet 실행

import winrm 

ps_text = "$pass = ConvertTo-SecureString -String '%s' -AsPlainText -Force; \ 
       Add-PSSnapIn Microsoft.Exchange.Management.Powershell.E2010; \ 
       New-Mailbox -UserPrincipalName '%[email protected]' \ 
       -Alias '%s' -Name '%s' -Password $pass \ 
       -Firstname '%s' \ 
       -Lastname '%s' \ 
       -DisplayName '%s' \ 
       -PrimarySmtpAddress '%s'" % \ 
       ('password123', 
       'jfd', 
       'john.doe', 
       'John Doe', 
       'John', 
       'Doe', 
       'John Doe', 
       '[email protected]') 

remote = winrm.Session('https://contoso.co.uk:5986', auth=('ps_remote', 'irrelevant')) 
r = remote_session.run_cmd("powershell", ["-version", "2.0", "-c", ps_text]) 

이 내가 얻을 출력은 다음과 같습니다

새로운 사서함 : 값 null 일 수 없습니다. 매개 변수 이름 : serverSettings 줄 : 1 char : 147 + $ pass = ConvertTo-SecureString -String 'password123'-AsPlainText -Force; Add-PSSnapIn 선택 Microsoft.Exchange.Management.Powershell.E2010; 새로운 사서함 < < < < -UserPrincipalName ' [email protected]'-alias '즉 John.Doe'- 이름 '홍길동'-Password $ 통과 -Firstname '존' -Lastname '미상'-DisplayName '홍길동 '-PrimarySmtpAddress' [email protected] ' + CategoryInfo : NotSpecified : (:) [새 사서함], 경우 ArgumentNullException + FullyQualifiedErrorId : System.ArgumentNullException, Microsoft.Exchange.Management.RecipientTasks.NewMailbox

$ pass가 따옴표로 묶이지 않은 것을 알기 때문에 작은 따옴표로 묶어 다음과 같이 표시합니다.

새 사서함 : '암호'매개 변수를 바인딩 할 수 없습니다. "System.String"유형의 "$ pass"값을 "System.Security.SecureString".At 줄 유형으로 변환 할 수 없습니다. 행 : 1 char : 231 + $ pass = ConvertTo-SecureString -String 'password123'-AsPlainText - 힘; Add-PSSnapIn 선택 Microsoft.Exchange.Management.Powershell.E2010; 새로운 사서함 -UserPrincipalName '[email protected]'-alias '즉 John.Doe' - 이름 '홍길동'-Password < < < < '$ 패스' -Firstname '존'-Lastname '미상'-DisplayName '홍길동'-PrimarySmtpAddress '[email protected]' + CategoryInfo : InvalidArgument : (:) [새 사서함], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage, Microsoft.Exchange.Management.RecipientTasks.NewMailbox

강조 광산. 이제 $ pass 변수를 확장하는 대신 문자 그대로 해석합니다. 이걸 올바르게 실행할 수있는 방법이 있습니까?

일부 노트 : 그 무엇은 Exchange이기로

  • 가 원격 측에 파워 쉘의 올바른 버전에 대해 실행하지 않는 한 나는 winrm.Session의 문서화 run_ps 방법을 사용하지 않는 (버전 2.0은 여기에 필요 관리 스냅인 필요).
  • pywinrm의 저수준 API를 패키지 페이지에서 자세히 설명했지만 사용하지 않으려 고 시도했습니다.
  • Powershell의 첫 번째 줄 뒤에 $pass;을 삽입하면 표준 출력은 실제로 System.Security.SecureString을 반환하므로 첫 번째 예의 null 인수에 대해 불만을 토로합니다.
  • 삼중 따옴표로 묶고 따옴표 스타일을 바꾸려고했습니다. 주사위가 없다.
  • 원격 세션을 가져 오기 위해 New-PSSession을 실행하기 위해 로컬 Powershell에 대한 하위 프로세스 호출을 포함하여 여러 가지 다른 방법을 시도했지만 실제로 필요한 cmdlet에 액세스하지 못합니다. 또한 원격으로 Invoke-Command을 사용하여 스크립트 블록을 실행 해 보았습니다.하지만 스냅인을 성공적으로 가져 왔지만 실제 cmdlet는 실행하지 않습니다.
  • 순수한 Python 솔루션이 선호 될 수 있습니다 (따라서 pywinrm을 사용하는 것이 좋습니다). 그러나이 단계에서는 아무 것도 열지 않습니다. 원격으로 New-Mailbox을 실행하는 예는 꽤 드물거나이 경우 Google-fu가 약합니다.

답변

0

PowerShell에서 작은 따옴표를 사용하면 변수 확장이 수행되지 않습니다.

나의 추천은 다음과 같습니다

  • , 당신은 게시 된 오류 메시지의 $pass
  • 공지 사항에서 따옴표를 제거 오류는 값
  • 통과하지 -Password, -serverSettings에서오고있다 -serverSettings (Exchange 설명서에서이 매개 변수를 찾을 수 없지만 버전이 존재하는지 여부를 확인하십시오.)
  • Windows 시스템에서 PowerShell 명령의 유효성을 검사합니다. 전자를 통해 명령을 실행하려고 시도합니다. pywinrm

희망이 있습니다. 건배

관련 문제