Carica explorer da PowerShell con bassi privilegi


2

Ho uno script di manutenzione di PowerShell che funziona in questo modo:

kill explorer
do things
restart explorer

Questo script viene eseguito in modalità elevata, ma avrei bisogno di riavviare explorer senza privilegi di amministratore. Qualche idea?

Grazie

Risposte:


6

Per quanto ne so, non è possibile avviare direttamente un processo non elevato (cioè con un token standard a basso privilegio) da un processo elevato. Questo non è un limite di PowerShell, è come funziona UAC in Windows.

A partire dal http://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx :

Una domanda frequente è come lanciare un'applicazione non elevata da un processo elevato, o più fondamentalmente, come avviare un processo usando il mio token non elevato una volta che sono in esecuzione. Poiché non esiste un modo diretto per farlo, la situazione può essere evitata di solito avviando l'applicazione originale come utente standard e elevando solo quelle parti dell'applicazione che richiedono diritti amministrativi. In questo modo è sempre disponibile un processo non elevato che può essere utilizzato per avviare applicazioni aggiuntive come utente desktop attualmente connesso. A volte, tuttavia, un processo elevato deve far funzionare un'altra applicazione senza elevazione. Questo può essere ottenuto utilizzando l'utilità di pianificazione in Windows Vista®. Il processo elevato può registrare un'attività da eseguire come utente desktop attualmente connesso.

Questo articolo menziona due possibili soluzioni:

  1. Esegui il maggior numero possibile di script in modalità non elevata e elevi solo per quelle parti che ne hanno bisogno. In altre parole, uccidi e riavvia explorer nello script non elevato ed esegui un secondo script in modalità elevata per "fare le cose":

    Stop-Process -ProcessName explorer
    Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
    Start-Process explorer.exe
    

    Il Runas verbo farà avviare il secondo processo di PowerShell in modalità elevata. Tuttavia, questo attiverà un prompt UAC, quindi se questo script deve essere eseguito completamente automatizzato, non è una buona soluzione.

  2. Creare un'attività pianificata per avviare explorer quando vengono eseguite le operazioni con privilegi elevati, eseguire l'attività ed eliminarla. Puoi usare schtasks.exe per fare questo:

    schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon
    schtasks /Run /TN "foobar"
    schtasks /Delete /TN "foobar" /F
    

    Assicurati di scegliere un nome per l'attività che non sarà in conflitto con un altro.

È inoltre possibile combinare i due metodi precedenti per creare un'attività pianificata per eseguire il secondo script PowerShell in modalità elevata e il resto non elevato. Questo ha il vantaggio di non produrre un prompt UAC, ma introduce il rischio per la sicurezza che chiunque abbia accesso in scrittura allo script possa fare praticamente qualsiasi cosa sul tuo computer. A seconda di come esattamente stai correndo e elevando il tuo script corrente, però, questo potrebbe essere un problema controverso.

Una terza opzione, se il tuo script è eseguito solo da te, è configurarla per avviare il nuovo processo explorer.exe con le tue credenziali:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred

Il rovescio della medaglia qui sta avendo la password memorizzata nello script in testo normale. È anche possibile memorizzarlo in un file separato in forma crittografata, digitando quanto segue in un prompt di PowerShell:

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt

Quindi digita la tua password (verrà mostrata come un asterisco nel prompt PS) e premi Invio. Ora puoi usarlo nel tuo script in questo modo:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred

Complimenti per la risposta completa. Grazie!
rlbisbe

1

L'unica cosa che viene in mente è usare l'utilità di pianificazione per riavviare explorer. Il processo di avvio o qualsiasi altro metodo sembra mantenere lo stato elevato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.