2009-08-21 5 views
7

j'ai le code C# suivantExecute PowerShell en tant qu'administrateur de C#

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

qui me donne l'exception

L'accès à la clé de Registre « HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell ' est refusée.

Selon this, la solution consiste à démarrer PowerShell en tant qu'administrateur.

D'habitude, cela peut être accompli en cliquant avec le bouton droit sur PowerShell et en sélectionnant "Exécuter en tant qu'administrateur". Y a-t-il un moyen de faire cela par programme?

Répondre

8

Vérifiez this sur

Vous devez usurper l'identité en tant qu'administrateur pour le faire (vous aurez bien sûr besoin des informations d'identification d'administrateur)

Vérifiez que l'article, qui est également livré avec le code prêt à l'emploi (je l'ai utilisé et il fonctionne très bien)

Fondamentalement, vous devez faire ceci:

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

Cela ne fonctionne pas pour moi sur Windows Server 2012 et PowerShell 3.0. :( – Anonymous

+3

Je suis surpris que l'OP ait marqué cela comme la réponse: dans la question, il dit "cliquer avec le bouton droit sur PowerShell et sélectionner" Exécuter en tant qu'administrateur ", ce qui implique que les informations d'identification sont déjà membres du groupe des administrateurs mais ils sont stoppés par la merveilleuse sécurité (toux, toux) que MS a ajouté appelé UAC La solution postée (et cochée) ne répond pas à cette question Une partie de moi dit de marquer cet article parce que la réponse ne résout pas le problème. * Posté * question ... – Jason

+0

Ceci est un code très ancien du projet de code 2005. Il ne fonctionnera pas dans Windows 2012. Je devrais trouver un moyen de le convertir en 64 bits –

2

privilèges administratifs sont à t il niveau d'application. L'application qui nécessite un accès administrateur dans ce cas est vôtre. Créer des espaces d'exécution en C# dans une application personnalisée n'invoque pas PowerShell l'application - il charge juste certains assemblys dans votre application. Cela dit, vous pouvez l'élever comme le dit l'autre affiche, bien que l'intégration des noms d'utilisateur et mots de passe admin dans le code source me rend malade.

-Oisin

+1

Il doesn ' Je dois ho dans le code source, mon extrait est juste un exemple – juan

0

Je pense qu'un modèle alternatif serait d'envelopper l'exécuteur powershell en une simple asp.net WebAPI webservice.

Le service Web peut alors être configuré pour s'exécuter avec les autorisations requises pour effectuer son travail. Il peut fournir sa propre sécurité pour déterminer quels clients peuvent l'appeler. Pour exécuter un script, il suffit d'appeler les méthodes webservice. Vous pouvez rendre la méthode assez générale - nom du script et paramètres.

C'est un peu plus de travail, mais beaucoup plus sécurisé (voir les pensées de x0n).

3

Je sais que c'est un vieux message, mais nous avons rencontré ce même problème récemment.

Nous avons dû la portée de la politique d'exécution sur la machine exécutant le code C# en exécutant les éléments suivants de PowerShell ...

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted 

Quand nous avions fait cela auparavant, sans portée, nous fixons la politique d'exécution pour l'administrateur. Visual Studio \ C# s'exécutait en tant qu'utilisateur actuel, provoquant l'échec avec des autorisations insuffisantes.

-2

Ceci est relativement très ancien poste. Mais j'ai trouvé une nouvelle façon de le faire. J'héberge l'API Web C# sur IIS 8 avec un code PowerShell que je veux utiliser avec des privilèges d'administrateur. J'ai donc fourni les informations d'identification de l'administrateur dans le paramètre Identité du pool d'applications.

IIS8 on Windows 2012 server

Il suffit de définir compte administrateur identité du pool d'applications.

J'espère que cela aide à tout le monde. :)

+0

Toujours éviter cela, car c'est un manque de sécurité grave – devi

+0

c'est beaucoup mieux que de garder les informations d'identification codées en dur ... :) @devi - Pensez-y une fois –

+0

pas d'accord, en cours d'exécution pool iis en tant qu'administrateur local est très mauvaise idée, rien d'autre ne peut pas être plus mauvais, même hardcode. Dans le cas général, l'obligation d'exécuter quelque chose en tant qu'administrateur local dans une application Web est un signe d'une mauvaise conception. – devi

Questions connexes