2009-08-21 14 views
7

Ich habe folgende C# -CodeFühren Sie Powershell als Administrator von C#

using (RunspaceInvoke invoker = new RunspaceInvoke()) 
{ 
    invoker.Invoke("Set-ExecutionPolicy Unrestricted"); 
    // ... 
} 

die mir die Ausnahme

Zugriff auf den Registrierungsschlüssel gibt ‚HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Powershell \ 1 \ ShellIds \ Microsoft.PowerShell ' wird verweigert.

Nach this ist die Lösung, PowerShell als Administrator zu starten.

Normalerweise kann dies erreicht werden, indem Sie mit der rechten Maustaste auf PowerShell klicken und "Als Administrator ausführen" auswählen. Gibt es eine Möglichkeit, dies programmatisch zu tun?

Antwort

8

prüfen this out

Sie müssen Identitätswechsel als Administrator, es zu tun (Sie werden natürlich Anmeldeinformationen benötigen Administrator)

prüfen, dass Artikel, die mit dem Code kommt auch sofort einsatzbereit (ich habe es benutzt und es funktioniert gut)

Grundsätzlich Sie dies tun müssen:

using (new Impersonator("myUsername", "myDomainname", "myPassword")) 
{ 
    using (RunspaceInvoke invoker = new RunspaceInvoke()) 
    { 
     invoker.Invoke("Set-ExecutionPolicy Unrestricted"); 
    } 
} 
+0

Dies funktioniert nicht für mich auf Windows Server 2012 und PowerShell 3.0. :( – Anonymous

+3

Ich bin überrascht, dass das OP dies als die Antwort markiert. In der Frage sagt er "mit der rechten Maustaste PowerShell und wählen Sie als Administrator ausführen", was bedeutet, dass die Anmeldeinformationen, unter denen sie ausgeführt werden, bereits ein Mitglied der Gruppe Administratoren ist Aber sie werden von der wundervollen Sicherheit (Husten, Husten) gestoppt, die MS hinzugefügt hat, UAC genannt. Die Lösung, die geschrieben (und abgehakt) wird, adressiert das nicht. Ein Teil von mir sagt, um diesen Beitrag zu markieren, weil die Antwort das nicht löst * posted * question ... – Jason

+0

Dies ist sehr alter Code aus dem Code-Projekt 2005. Es wird nicht in Windows 2012 funktionieren. Ich müsste einen Weg finden, um es in 64 Bit zu konvertieren. –

2

Administratorrechte bei t sind er Anwendung Ebene. Die App, die in diesem Fall Administratorzugriff benötigt, ist Ihr. Das Erstellen von Runspaces in C# in einer benutzerdefinierten App ruft die Powershell-Anwendung nicht auf - sie lädt nur einige Assemblys in Ihre Anwendung.

Das heißt, Sie können erhöhen, wie das andere Plakat sagte, obwohl die Einbettung von Admin-Benutzernamen und Passwörter in den Quellcode mich krank fühlen.

-Oisin

+1

Es doesn ' t ho in den Quellcode, mein Snippet ist nur ein Beispiel – juan

0

Ich denke, ein alternatives Modell des Powershell-Vollstrecker in einen einfachen asp.net WebAPI Webservice zu wickeln wäre.

Der Webservice kann dann so konfiguriert werden, dass er mit den erforderlichen Berechtigungen ausgeführt wird, die für seine Aufgabe erforderlich sind. Es kann seine eigene Sicherheit bereitstellen, um festzustellen, welche Clients es aufrufen können.

Um ein Skript auszuführen, würden Sie nur Webservice-Methoden aufrufen. Sie könnten die Methode ziemlich allgemein machen - Skriptname und Parameter.

Es ist ein bisschen mehr Arbeit, aber viel sicherer (siehe x0n Gedanken).

3

Ich weiß, dass dies ein alter Beitrag ist, aber wir sind in letzter Zeit auf dieses Problem gestoßen.

Wir hatten die Ausführungsrichtlinie auf der Maschine Umfang den C# -Code ausgeführt wird durch die folgende von Powershell ausgeführt ...

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted 

Wenn wir dies vorher getan hatte, ohne Scoping wurden setzen wir die Ausführungsrichtlinie für Administrator. Visual Studio \ C# wurde als aktueller Benutzer ausgeführt, was dazu führte, dass es mit unzureichenden Berechtigungen fehlschlug.

-2

Dies ist relativ sehr alte Post. Aber ich habe einen neuen Weg gefunden, dies zu tun. Ich hostiere die C# -Web-API auf IIS 8 mit Powershell-Code, den ich mit Administratorrechten ausführen möchte.

Also habe ich die Administrator-Anmeldeinformationen in der Identität des Anwendungspools angegeben.

IIS8 on Windows 2012 server

Nur Administrator-Konto in App Pool Identität festgelegt.

Hoffen, dass dies jedem hilft. :)

+0

Vermeiden Sie immer dies, denn das ist ein ernsthafter Sicherheitsmangel – devi

+0

es ist viel besser als das Festhalten von Anmeldeinformationen fest codiert ... :) @devi - einmal darüber nachdenken –

+0

nicht einverstanden, laufen Iis Pool als lokaler Administrator ist sehr schlechte Idee, nichts anderes kann nicht schlechter sein, auch Hardcode. Im Allgemeinen ist die Anforderung, etwas als lokaler Administrator in einer Webanwendung auszuführen, ein Signal für schlechtes Design. – devi

Verwandte Themen