0

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 der winrm.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ächlich System.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 von Invoke-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.

Antwort

0

In PowerShell verhindern einfache Anführungszeichen das Auftreten einer Variablenerweiterung.

würde meine Empfehlung:

  • Entfernen Sie die einzelnen Zitate aus dem $pass
  • Hinweis in der Fehlermeldung Sie auf dem Laufenden, dass der Fehler von -serverSettings kommt, nicht -Password
  • Pass in einem Wert für -serverSettings (Ich konnte diesen Parameter in Exchange-Dokumentation nicht finden, aber überprüfen Sie, ob es in Ihrer Version vorhanden ist oder nicht)
  • Überprüfen Sie den PowerShell-Befehl auf einem Windows-System, vor e versucht, den Befehl über pywinrm

Hope this hilft! Prost