Yönetici olmayan hizmet hesabı olarak powerhshell ile bir hizmetin zamanlanmış olarak yeniden başlatılması


11

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.

resim açıklamasını buraya girin

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.


Bu bazı yardımcı olabilir serverfault.com/questions/357424/…
Powershell


@ Drifter104: Hizmette izinleri ayarlamak için GPO kullanmamıza rağmen, subinacl değil, yine de STOE parametreleriyle denemeye devam ettim, ancak yine de aynı sonucu görüyorum. GPO ayarlarımı iki kez kontrol ettim ve Bağımlı Hizmetleri Numaralandır seçeneğini de etkinleştirdiler.
VolrathTheFallen

@ MyronSemack-msemack Hizmette SDDL dizesini makalede anlatıldığı gibi manuel olarak ayarlamayı denedim, ancak yine de şans yok Bir GPO ve subinacl'ın bir şeyi ve diğerlerini geçersiz kıldıkları gibi aynı şeyi yaptığını düşünüyorum.
VolrathTheFallen

1
CmdLet 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.)
John aka hot2use

Yanıtlar:


3

Başka bir soruya anwser yanı sorunumu çözdü.

Yaptığım adımlar:

  1. enable-psremoting bir yönetici powershell isteminde sunucuda
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI bir yönetici powershell isteminde sunucuda
  3. Tam ayrıcalıklarla hizmet hesabı (veya güvenlik grubu) eklendi
  4. sc sdshow scmanager sunucuda bir yönetici komut isteminde
  5. SDDL çıktısını kopyalayın
  6. (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)S: bölümünden önce SDDL'ye ekleyin
  7. sc sdset scmanager THE_MODIFIED_SDDL benimki şöyle görünüyordu: 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. Start-ServicePowershell betiğimi Set-Service(Set-Service işe yaramadı) yerine CmdLet'i kullanacak şekilde değiştirin .

Görünüşe göre, basit bir şey ortaya çıktı, olması gerekenden daha karmaşık ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.