Mi è capitato varie volte di dover schedulare dei task tramite dei batch per eseguire operazioni di manutenzione di un server. Come buona norma questi task dovrebbero essere eseguiti con un utente non amministratore ma che abbia gli opportuni diritti per eseguire determinate operazioni. Diciamo che nella stragrande maggioranza dei casi ciò è "facilmente"
possibile. Se però tra le varie operazioni da eseguire è incluso anche lo start/stop di un servizio allora la questione si complica per 2 motivi:
1. Un utente non admin di default non ha i diritti di start/stop sui servizi.
2. L'eseguibile net.exe (utilizzato solitamente per eseguire lo start/stop dei servizi da CLI) non funziona in modalità batch!!! A quanto pare questo è un comportamento by-design presente in TUTTE le versioni di Windows (io personalmente ho testato questo comportamento su Windows Server 2003 R2, Windows Server 2008, Windows Server 2008 R2).
Dopo ore di test sono riuscito finalmente a trovare un workaround per questo problema!!!
1. Usando le Group Policy possiamo facilmente gestire i security settings dei servizi, ecco come:
- Apriamo la mmc (start => run => mmc) e aggiungiamo lo snap-in "Security Templates"
- Creiamo un nuovo template (tasto dx sulla root => new template => nel mio esempio si chiama "test")
- Doppio click sul servizio che ci interessa e qui andiamo ad impostare le security che ci interessano (come dicevamo prima start/stop del servizio)
- A questo punto possiamo fare tasto dx => Save As ed esportare il nostro template in un file .inf che andremo ad importare in una GPO creata a questo scopo e applicata al server interessato (questa procedura è necessaria perchè l'elenco dei servizi disponibili per i server è diverso e non possiamo gestire tutto solo dalla GPMC); per importare il file .inf è sufficiente aprire la GPO (edit) => tasto dx nella sezione Computers\Windows Settings\Security Settings =>Import Policy => selezionare il file .inf precedentemente creato
- Per applicare sul nostro server i cambiamenti sarà necessario eseguire il solito "gpupdate /force"
2. Per il secondo problema sarà sufficiente usare i seguenti comandi da inserire nel nostro batch:
sc stop
"my service" /y
sc start
"my service"Invece che:
net stop
"my service" /y
net start
"my service"Ciauzzz