2016-06-23 14 views
0

Der Punkt des gesamten Programms:Wie führe ich ein Powershell-Skript in C++ aus?

Geben Sie einen Benutzernamen und ein Passwort ein, um die Berechtigungen eines Benutzers zu erhöhen, damit Benutzer, die nicht auf einen geschützten Ordner zugreifen können, diesen öffnen und anzeigen können. Der Benutzername wird in einem <map> abgebildet, die einen Schlüssel zu ihrem Ordner enthält, sucht es nach ihren Ordner geht es dann mit dem Benutzernamen und Passwort an die reale Höhe in der folgenden Powershell-Skript zu tun:

param(
    [string]$username, 
    [string]$password, 
    [string]$folder 
    ) 
    Write-Host $username $password $folder 
  
    $securePassword = ConvertTo-SecureString $password -AsPlainText -Force 
    $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword 
    Start-Process T:\folders\Explorer++\Explorer++.exe \\foo\boo\fileserver\allusers\specialUsers\$folder -Credential $credential 

ich vorbei bin in den Benutzernamen, das Passwort und den Ordner in dieses Skript durch die Verwendung von System().

Der C++ Code, um das Skript und übergeben Variablen sieht wie folgt auszuführen:

String^ runCommand(string folder, string username, string password) 
    { 
     string explorerpp = "\\\\foo\\boo\\examplefolder\\Explorer++\\EXPLORER++.exe"; 
     string space = " "; 
     string quote = "\""; 
     string start = "C:\\ProgramData\\Microsoft\Windows\\Start Menu\\Programs\\System Tools\\Windows Powershell"; 
     string open = "open"; 
     string domain = "domain\\"; 
     string pwShell = "S:\\foo\\boo\\locationofscript\\pwShell.ps1 "; 
     string parentFolder = """\\\\foo\\boo\\folder\\Parent_folder\\special_users \\"""; 
     string path = parentFolder + folder; 
     String^ dir = gcnew String(path.c_str()); 
     string param = quote + domain+ username + quote + space + quote + password + quote + space + quote + folder + quote; 
     string command = "start powershell.exe" + space + pwShell + param;   
     system(command.c_str()); 
     return dir; 
    } 

Hinweis: Der Code sieht, wie es funktioniert aufgrund einer großen Menge an Debugging, verstehe ich, dass ich wahrscheinlich bin mit viele nicht benötigte Variablen.

Wenn System() oder _popen durchlaufen wurde, wird entweder eine .txt-Datei geöffnet, die ein Skript enthält, oder Fehler an der Eingabeaufforderung.

Wenn ich nehme, was der Wert string command ist und fügen Sie es in eine Eingabeaufforderung Ich würde das Skript korrekt ausgeführt und dann öffnen Sie den richtigen Ordner.

Was ist das Problem mit C++, das es nicht erlaubt, dass das Skript korrekt ausgeführt wird, wenn die Eingabeaufforderung alles korrekt ausführt?

BIG EDIT:

Der Fehler, den ich bekommen habe ist C:\OurProj\pwShell.ps1 : File C:\OurProj\pwshell.ps1 cannot be loaded because running scripts is disabled on this system.

Ich habe nur auf die IT-Leute reden, und ich bin in der Lage Skripte auf diesem System laufen zu lassen, versuchte alles lokal zu machen, und wenn Ich führe das Skript durch Powershell funktioniert es.

EDIT 2:

Ich habe die Execution Policy geändert, wie vorgeschlagen wurde, und es tut RemoteSigned zurückkehren, aber wenn der Code in C++ ausführt ich noch gesagt, dass ich Skripte deaktiviert.

+3

Wo ist 'command' tatsächlich initialisiert? – Andrew

+0

@Andrew versehentlich bei der Formatierung zu Post für Stack-Überlauf entfernt, wird es jetzt an der richtigen Stelle hinzugefügt. Das ist direkt über dem 'system (command.c_str())' Aufruf. – Bridger

+0

In meinem System ist die Standardoperation von der Befehlszeile für eine .ps1-Datei das Öffnen in Notepad. (zB: wenn ich den Befehlsinhalt in der Befehlszeile starte, öffnet sich der Editor, nicht das Skript) Dies ist unter Windows 7. Sie müssen 'powershell.exe' vor Ihren Befehl setzen. – ebyrob

Antwort

0

In einer Umgebung können Sie nicht signierte Power Shell-Skripts ausführen, in einem anderen jedoch nicht. 64-Bit- und 32-Bit-Versionen haben jeweils eine eigene Ausführungsrichtlinie für die Power Shell. Höchstwahrscheinlich laufen Sie auf einem 64-Bit-Betriebssystem und erstellen ein 32-Bit-C++ - Programm (Standard für Visual Studio).

Sie können zu einem bekommen 32-Bit-Power-Shell, indem Sie die folgenden Schritte aus:

auf dem Startbildschirm, geben Sie Windows Powershell (x86). Führen Sie dies als Administrator aus.

Weiter führen Sie den Befehl:

Set-ExecutionPolicy RemoteSigned 

Jetzt sollten Sie in der Lage sein, nicht signierte lokale Stromskriptdateien von einer 32-Bit-Umgebung auf Ihrem Computer ausgeführt werden.

Vom Startmenü Sie entweder Powershell-Umgebung erhalten können, müssen Sie die gleiche Ausführungsrichtlinie für sowohl den Befehl festgelegt ist:

Get-ExecutionPolicy 
+0

Ich habe diesen Befehl in PowerShell als Administrator ausgeführt, und wenn ich die Ausführungsrichtlinie abrufen, wird RemoteSigned zurückgegeben. Aber ich bekomme immer noch, dass das Ausführen von Skripts auf diesem Computer als Sicherheitsrisiko deaktiviert ist, wenn ich versuche, meinen Code auszuführen. Erhalte ich eine andere Powershell, wenn ich sie über C++ anrufe? – Bridger

+0

@BridgerWinter Sie müssen es für 32-und 64-Bit-Umgebungen festlegen. Versuchen Sie die Einstellung in Ihrer Anwendung, wenn nichts anderes funktioniert. – ebyrob

Verwandte Themen