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가 약합니다.