Riavvio programmato di un servizio con powerhshell come account di servizio non amministratore


11

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.

inserisci qui la descrizione dell'immagine

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.


Questo potrebbe essere di qualche aiuto serverfault.com/questions/357424/... sembra PowerShell è molto esigente sulle autorizzazioni e non quelli ovvi
Drifter104


@ Drifter104: Anche se utilizzo GPO per impostare le autorizzazioni sul servizio, non subinacl, l'ho provato comunque con i parametri STOE, ma vedendo comunque lo stesso risultato. Ho ricontrollato le mie impostazioni dell'oggetto Criteri di gruppo e hanno abilitato anche l'opzione Enumera servizi dipendenti.
VolrathTheFallen,

@ MyronSemack-msemack Ho provato a impostare manualmente la stringa SDDL per il servizio come descritto nell'articolo, ma ancora sfortunatamente penso che alla fine un oggetto Criteri di gruppo e un subinacl facciano la stessa cosa, poiché sembrano sovrascrivere l'uno e l'altro.
VolrathTheFallen il

1
Che ne dici di provare Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....invece di Stop-ServiceCmdLet? 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ì.)
John aka hot2use,

Risposte:


3

La risposta a un'altra domanda ha risolto anche il mio problema.

I passi che ho fatto sono stati:

  1. enable-psremoting sul server in un prompt di amministrazione PowerShell
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI sul server in un prompt di amministrazione PowerShell
  3. Aggiunto l'account del servizio (o gruppo di sicurezza) con privilegi completi
  4. sc sdshow scmanager sul server in un prompt dei comandi di amministrazione
  5. Copia l'output SDDL
  6. Aggiungi (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)a SDDL prima della parte S :.
  7. sc sdset scmanager THE_MODIFIED_SDDL il mio sembrava così: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Modifica il mio script PowerShell in modo che utilizzi Start-ServiceCmdLet anziché Set-Service(Set-Service non ha funzionato).

Sembra che qualcosa di semplice si sia rivelato, MODO più complicato di quanto avrebbe dovuto essere ...

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.