Ich habe versucht, das pywinrm-Modul dazu zu veranlassen, das Powershell-Cmdlet New-Mailbox
remote auszuführen. Das ist, was ich habe, so weit:pywinrm - New-Mailbox-Powershell-Cmdlet remote ausführen
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])
Dies ist die Ausgabe erhalte ich:
New-Mailbox: Wert nicht null sein kann. Parametername: serverSettings Bei Zeile: 1 Zeichen: 147 + $ pass = ConvertTo-SecureString -String 'password123' -AsPlainText -Force; Add-PSSnapIn Microsoft.Exchange.Management.Powershell.E2010; New-Mailbox < < < < -UserPrincipalName '[email protected]' -alias 'john.doe' -Name -Password $ Pass -Firstname 'John Doe' 'John' -Lastname 'Doe' -DisplayName ‚John Doe '-PrimarySmtpAddress '[email protected]' + CategoryInfo: NotSpecified: (:) [New-Mailbox], Argument + FullyQualifiedErrorId: System.ArgumentNullException, Microsoft.Exchange.Management.RecipientTasks.NewMailbox
Ich denke, es ist nicht wie $ Pass nicht quoted, so dass ich dann in einfache Anführungszeichen wrap und erhalten:
New-Mailbox: Parameter 'Passwort' kann nicht gebunden werden. Der Wert "$ pass" des Typs "System.String" kann nicht in den Typ "System.Security.SecureString" konvertiert werden. Zeile: 1 Zeichen: 231 + $ pass = ConvertTo-SecureString -String 'password123' - AsPlainText - Macht; Add-PSSnapIn Microsoft.Exchange.Management.Powershell.E2010; New-Mailbox -UserPrincipalName '[email protected]' -alias 'john.doe' -Name 'John Doe' -Password < < < < '$ pass' -Firstname 'John' -Lastname 'Doe' -DisplayName 'John Doe' -PrimarySmtpAddress '[email protected]' + CategoryInfo: InvalidArgument: (:) [New-Mailbox], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.Exchange.Management.RecipientTasks.NewMailbox
Emphasis meins. Und jetzt interpretiert es es wörtlich, anstatt die Variable $ pass zu erweitern. Gibt es eine Möglichkeit, wie ich das korrekt ausführen kann?
Einige Anmerkungen:
- Ich bin nicht die dokumentierte
run_ps
Methode derwinrm.Session
Verwendung, da es gegen die richtige Version von Powershell nicht ausgeführt wird, auf der Remote-Seite (Version 2.0 hier erforderlich, da das ist, was der Exchange Management Snap-In erfordert). - Ich habe versucht, die Low-Level-API von Pywinrm wie auf der Paketseite beschrieben, aber es ist nicht gut.
- Wenn ich
$pass;
nach der ersten Zeile von Powershell einfügen, gibt die Standardausgabe tatsächlichSystem.Security.SecureString
zurück, was es noch seltsamer macht, dass es sich über ein Null-Argument im ersten Beispiel beschweren würde. - Ich habe versucht, in Triple-Anführungszeichen zu wickeln und Zitat-Stile zu tauschen. Kein Würfel.
- Ich habe verschiedene andere Methoden ausprobiert, einschließlich Unterprozessaufrufe an eine lokale Powershell, um
New-PSSession
auszuführen, um die Remotesitzung zu importieren, aber dies schlägt fehl, um tatsächlich Zugriff auf das Cmdlet zu erhalten, das ich benötige. Ich habe auch versucht, Skriptblöcke unter Verwendung vonInvoke-Command
remote auszuführen, aber obwohl das das Snap-In erfolgreich importiert, führt es das tatsächliche Cmdlet nicht aus. - Eine reine Python-Lösung wäre vorzuziehen (daher die Verwendung von Pywinrm), aber ich bin offen für alles in diesem Stadium. Beispiele für den Remote-Betrieb
New-Mailbox
sind ziemlich spärlich, oder vielleicht ist mein Google-Fu in diesem Fall schwach.