Vurulmadan önce, bir görevi nasıl zamanlayacağımı, powershell ile bir hizmeti nasıl yeniden başlatacağımı veya yönetici olmayan bir hesaba bir hizmeti yeniden başlatma ayrıcalıklarını nasıl vereceğimi biliyorum. Sorun bu değil. Ancak sorun, bu üç görevin birleşimidir.
Ağ klasöründeki dosyaları işlemek için bir windows hizmetim var. Bu nedenle, aslında normal bir etki alanı hesabı olan bir "hizmet hesabı" ile oturum açar. Bu etki alanı hesabı bir yönetici değil, adı geçen klasöre erişim haklarına sahip. Hizmet iyi çalışır ve iş yok.
Ancak, bazen dosyalardan birinde diğer dosyaların işlenmesini engelleyen bir hata vardır. Genellikle birisinin fark etmesi biraz zaman alır ve bazı birikmiş işler vardır.
Bu yüzden, bu hatalı dosyalar için ağ klasörünü yoklayan powershell'de bir izleme komut dosyası oluşturdum. Bulunursa, dosyalar incelenmek üzere geçici bir klasöre taşınır ve hizmetin yeniden başlatılması gerekir.
Hizmeti başlatmak ve durdurmak için hizmet hesabı ayrıcalıklarını grup ilkesi aracılığıyla verdim.
Hizmet hesabıyla sunucuya oturum açtığımda, Hizmetler MMC'yi kullanarak hizmeti el ile yeniden başlatabiliyorum. Ayrıca powershell betiğini yürütmek mümkün ve tam olarak ne gerekiyorsa yapar: klasörü yoklama, dosyaları taşımak ve hizmeti yeniden başlatın. Harika!
Bir sonraki aşamada, her 10 dakikada bir çalışan zamanlanmış bir görev oluşturdum. Görev, powershell betiğini yürütmek için hizmetle aynı hizmet hesabını kullanır. "En yüksek ayrıcalıklarla yürüt" kutusu işaretlidir. Dediğim gibi, powershell betiğinin ağ sürücüsüne erişmesi gerekiyor, bu yüzden yerel sunucu yöneticisi olarak çalıştıramıyorum ve böyle bir görev için etki alanı yöneticisi kimlik bilgilerini kullanmak istemiyorum. (En az imtiyaz ilkesini elimden geldiğince uygulamaya çalışıyorum.)
Hizmet hesabına, Yerel Güvenlik İlkesi MMC'yi kullanarak yerel sunucuda "toplu iş olarak oturum aç" hakları verdim.
Şimdi anlayamadığım kısım için: Planlanan zamanda planlanan görevler başarıyla tamamlanır ve powershell betiği yürütülür. Komut dosyası klasörü yoklar ve hata dosyaları taşınır. İşe yaramayan tek şey hizmeti yeniden başlatmak ...?! Yine, aynı kullanıcı ile komut dosyasını manuel olarak çalıştırmak mükemmel çalıştı.
Olay görüntüleyicisinde fazla görmüyorum, ancak komut dosyamdaki günlük kaydı şu hatayı gösteriyor:
TerminatingError (Stop-Service): "Bilgisayarda Service Control Manager açılamıyor '." Bu işlem başka ayrıcalıklar gerektirebilir. "
Hizmeti yeniden başlatmak için kullandığım komutlar:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(2008 R2 Etki Alanında Windows Server 2012 R2 ve Powershell Sürüm 4 kullanıyorum.)
Güncelleme: Her ikisi de subinacl ( burada açıklandığı gibi ) kullanarak kullanıcı için hizmet izinlerini ayarlamayı ve SDDL dizesini manuel olarak ( burada açıklandığı gibi) ayarlamayı denedim , bu yüzden kontrol bayraklarım şöyle görünüyor (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Ayrıca GPO'da hizmet üzerindeki ayrıcalıkları Tam Denetim olarak ayarlamayı denedim. Bunların hiçbiri de sorunu çözmedi. Bana hala göz ardı ettiğim bir yerde ayrıcalıklarla ilgili bir sorun olmalı , çünkü görevi sunucuda yerel bir yönetici olan bir etki alanı hesabıyla zamanladığımda, gayet iyi çalışıyor.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
yerine denemeye ne dersiniz Stop-Service
? Stop-Service ve Start-Service bu yanıta göre uzaktan erişilemiyor: Uzak bilgisayarda Get-Service –BilgisayarAdı kullanılamıyor ve hata iletiniz bir "uzak" localhost'a bağlanmaya çalışmakla ilgili olabilir. (<== buradaki bir nokta.)