2009-08-21 15 views
7

Ho il seguente codice C#Esegui PowerShell come amministratore da C#

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

che mi dà l'eccezione

L'accesso alla chiave di registro 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell ' negato.

Secondo this, la soluzione è avviare PowerShell come amministratore.

In genere, ciò può essere ottenuto facendo clic con il pulsante destro del mouse su PowerShell e selezionando "Esegui come amministratore". C'è un modo per farlo a livello di programmazione?

risposta

8

check out this

È necessario impersonare come amministratore per farlo (avrete ovviamente bisogno di credenziali di amministratore)

Verificare che l'articolo, che viene fornito con il codice pronto per l'uso (ho usato e funziona benissimo)

in sostanza, è necessario fare questo:

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

Questo non funziona per Windows Server 2012 e PowerShell 3.0. :( – Anonymous

+3

Sono sorpreso che l'OP abbia contrassegnato questa come risposta. Nella domanda afferma "facendo clic con il pulsante destro del mouse su PowerShell e selezionando" Esegui come amministratore "" che implica che le credenziali in esecuzione sono già membri del gruppo degli amministratori ma vengono fermati dalla meravigliosa sicurezza (tosse, tosse) che MS ha aggiunto chiamato UAC. La soluzione postata (e spuntata come) non affronta questo. Una parte di me dice di segnare questo post perché la risposta non risolve il problema * postato * domanda ... – Jason

+0

Questo è un codice molto vecchio dal progetto di codice 2005. Non funzionerà in Windows 2012. Dovrei trovare un modo per convertirlo a 64 bit. –

2

privilegi amministrativi sono a t he livello applicazione. L'app che richiede l'accesso amministratore in questo caso è tua. La creazione di spazi di corsa in C# in un'app personalizzata non richiama l'applicazione PowerShell: carica solo alcuni assembly nell'applicazione.

Detto questo, è possibile elevare come ha detto l'altro poster sebbene l'incorporamento di nomi utente e password di amministratore nel codice sorgente mi facciano sentire male.

-Oisin

+1

Non funziona devo inserire nel codice sorgente, il mio frammento è solo un esempio – juan

0

penso un modello alternativo sarebbe quella di avvolgere l'esecutore PowerShell in un semplice webservice asp.net WebAPI.

Il servizio Web può quindi essere configurato per l'esecuzione con le autorizzazioni necessarie necessarie per eseguire il proprio lavoro. Può fornire la propria sicurezza per determinare quali client possono chiamarlo.

Per eseguire uno script, è sufficiente chiamare i metodi di servizio web. Potresti rendere il metodo abbastanza generale - nome e parametri dello script.

È un po 'più di lavoro, ma molto più sicuro (vedi i pensieri di x0n).

3

So che questo è un vecchio post, ma ci siamo imbattuti in questo stesso problema di recente.

Abbiamo dovuto ambito il criterio di esecuzione sulla macchina che esegue il codice C# eseguendo il seguente da PowerShell ...

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted 

Quando abbiamo fatto presente in precedenza, senza scoping, siamo stati l'impostazione della strategia di esecuzione per l'amministratore. Visual Studio \ C# era in esecuzione come utente corrente, causando un errore con autorizzazioni insufficienti.

-2

Questo post è relativamente vecchio. Ma ho trovato un nuovo modo per farlo. Sto ospitando il C# web api su IIS 8 con un codice PowerShell che voglio eseguire con i privilegi di amministratore.

Quindi ho fornito le credenziali di amministratore nell'impostazione dell'identità del pool di applicazioni.

IIS8 on Windows 2012 server

Basta impostare account di amministratore in dell'identità del pool di app.

Spero che questo sia di aiuto a chiunque. :)

+0

Evita sempre questo, perché questa è la mancanza di sicurezza seria – devi

+0

è molto meglio che mantenere le credenziali codificate ... :) @devi - pensateci una volta –

+0

non concordato, eseguire iis pool come amministratore locale è una pessima idea, nient'altro non può essere più cattivo, anche hardcode. In generale, il requisito di eseguire qualcosa come amministratore locale nell'applicazione Web è un segnale di progettazione scadente. – devi

Problemi correlati