Prima di essere abbattuto, so come pianificare un'attività, riavviare un servizio con PowerShell o assegnare a un account non amministratore i privilegi per riavviare un servizio. Non è questo il problema. Il problema tuttavia è la combinazione di tutte e tre queste attività combinate.
Ho un servizio Windows che deve elaborare i file su una cartella di rete. Pertanto accede con un "account di servizio" che in realtà è solo un normale account di dominio. Questo account di dominio non è un amministratore ma ha diritti di accesso a detta cartella. Il servizio funziona bene e fa il suo lavoro.
Tuttavia, a volte c'è un errore in uno dei file che impedisce l'elaborazione di altri file. Di solito ci vuole un po 'per notare qualcuno e c'è un po' di arretrato.
Quindi, ho creato uno script di monitoraggio in PowerShell che esegue il polling della cartella di rete per questi file errati. Se vengono trovati, i file vengono spostati in una cartella temporanea per la revisione e il servizio deve essere riavviato.
Ho dato i privilegi dell'account di servizio tramite i criteri di gruppo per avviare e interrompere il servizio.
Quando accedo al server con l'account del servizio, sono in grado di riavviare il servizio manualmente utilizzando MMC Servizi. Sono anche in grado di eseguire lo script PowerShell e fa esattamente quello che dovrebbe fare: eseguire il polling della cartella, spostare i file e riavviare il servizio. Grande!
Nella fase successiva, ho creato un'attività pianificata che viene eseguita ogni 10 minuti. L'attività utilizza lo stesso account di servizio del servizio per eseguire lo script PowerShell. La casella "Esegui con i privilegi più alti" è selezionata. Come ho detto, lo script PowerShell ha bisogno di accedere all'unità di rete, quindi non posso eseguirlo come amministratore del server locale e non voglio usare le credenziali dell'amministratore di dominio per un'attività così umile come questa. (Cerco di attuare il principio del privilegio minimo il più possibile.)
Ho concesso all'account di servizio i diritti di "accesso come processo batch" sul server locale utilizzando la politica di sicurezza locale MMC.
Ora per la parte che non riesco a capire: all'ora pianificata le attività pianificate si completano correttamente e lo script PowerShell viene eseguito. Lo script esegue il polling della cartella e i file di errore vengono spostati. L'unica cosa che non funziona è il riavvio del servizio ...?! Ancora una volta, l'esecuzione dello script manualmente come lo stesso utente ha funzionato perfettamente.
Non vedo molto nel Visualizzatore eventi, ma la registrazione sul mio script indica questo errore:
TerminatingError (Stop-Service): "Impossibile aprire Service Control Manager sul computer '.'. Questa operazione potrebbe richiedere altri privilegi."
I comandi che utilizzo per riavviare il servizio sono:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Sto usando Windows Server 2012 R2 e PowerShell versione 4 su un dominio 2008 R2.)
Aggiornamento: entrambi ho provato a impostare le autorizzazioni del servizio per l'utente usando subinacl (come descritto qui ) e impostando manualmente la stringa SDDL (come descritto qui ), quindi i miei flag di controllo sembrano così (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Ho anche provato a impostare i privilegi sul servizio su Controllo completo nell'oggetto Criteri di gruppo. Nessuno di questi ha risolto il problema. Devo essere un problema con privilegi da qualche parte che sto ancora trascurando, perché quando pianifico l'attività con un account di dominio che è un amministratore locale sul server, funziona bene.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
invece di Stop-Service
CmdLet? A quanto pare, Stop-Service e Start-Service non sono in grado di remotare in base a questa risposta: non è possibile utilizzare Get-Service –ComputerName sul computer remoto e il messaggio di errore potrebbe essere correlato al tentativo di connettersi a un "host locale" remoto "." (<== è un punto lì.)