Bagaimana cara saya memberikan izin untuk memulai / menghentikan layanan menggunakan Powershell dari jarak jauh?

10

Kami memiliki skrip PowerShell yang me-restart layanan di komputer lain. Ketika kami menggunakan cmdlet kontrol layanan bawaan PowerShell, seperti:

$svc = Get-Service -Name MyService -ComputerName myservicehostname
Stop-Service -InputObject $svc
Start-Service -InputObject $svc

Kami mendapatkan kesalahan ini kembali:

Stop-Service: Tidak dapat membuka layanan MyService di komputer 'myservicehostname'.

Namun, ketika kita menggunakan sc.exe, seperti:

C:\Windows\System32\sc \\myservicehostname stop MyService
C:\Windows\System32\sc \\myservicehostname start MyService

mulai dan berhenti berhasil.

Pengguna yang melakukan restart bukanlah administrator. Kami menggunakan subinacl untuk memberikan izin kepada pengguna untuk memulai / menghentikan dan meminta layanan:

subinacl.exe /service MyService /GRANT=MyServiceControlUser=STO

Kenapa PowerShell tidak bisa menghentikan layanan saya tetapi sc.exebisa?

bit cipratan
sumber

Jawaban:

20

Ternyata saya tidak memberikan izin yang cukupsubinacl . Nilai akses yang mungkin untuk tindakan hibah adalah:

    F : Full Control  
    R : Generic Read  
    W : Generic Write  
    X : Generic eXecute  
  or any following values  
    L : Read controL  
    Q : Query Service Configuration  
    S : Query Service Status  
    E : Enumerate Dependent Services  
    C : Service Change Configuration  
    T : Start Service  
    O : Stop Service  
    P : Pause/Continue Service  
    I : Interrogate Service  
    U : Service User-Defined Control Commands  

Saya menggunakan S (Status Layanan Kueri), T (Layanan Mulai), dan O (Layanan Berhenti). Saya juga membutuhkan E (Enumerate Dependent Services). Tampaknya cmdlet PowerShell perlu melihat layanan dependen ketika memulai / menghentikan.

Inilah subinaclperintah saya yang diperbarui :

subinacl.exe /service MyService /GRANT=MyServiceControlUser=STOE

Jika Anda tidak ingin mengunduh / menggunakan subinacl.exe, Anda dapat menggunakan PowerShell melalui modul Grant-ServiceControlPermission atau fungsi Grant-ServicePermission dari modul Carbon . (DISCLAIMER: Saya adalah pemilik / pemelihara proyek Karbon.)

bit cipratan
sumber
Tandai ini sebagai jawaban Anda yang benar. Ini sangat membantu saya untuk masalah yang sama persis :)
Alain O'Dea
Saya belum pernah dengar subinaclsebelumnya. Utilitas yang sangat berguna! Terima kasih telah kembali untuk meninggalkan informasi ini untuk kami semua.
Dan
Berfungsi bagus di lingkungan non-domain dengan server Windows 2016 untuk mengontrol layanan di komputer jarak jauh.
Doug Knudsen
0

Perintah berikut berfungsi seperti yang diharapkan pada mesin Windows Server 2008 R2 saya.

Start-Service -InputObject $(Get-Service -Computer [ComputerName] -Name spooler)  

Bisakah Anda juga mencoba perintah satu kali ini untuk menentukan apakah itu berfungsi, apakah Anda sudah memverifikasi bahwa pengguna adalah anggota grup yang merupakan anggota grup Pengguna di server target?

Greg Askew
sumber
Cuplikan Anda tidak bekerja untuk saya. Karena persyaratan keamanan, saya tidak dapat membuat pengguna menjadi anggota grup Pengguna (atau grup Windows bawaan).
Potongan-potongan berceceran