¿Cómo otorgo permisos para iniciar / detener un servicio de forma remota con Powershell?

10

Tenemos un script de PowerShell que reinicia un servicio en otra computadora. Cuando usamos los cmdlets de control de servicio integrados de PowerShell, así:

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

Recibimos este error:

Stop-Service: No se puede abrir el servicio MyService en la computadora 'myservicehostname'.

Sin embargo, cuando usamos sc.exe, así:

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

El comienzo y la parada tienen éxito.

El usuario que reinicia no es un administrador. Usamos subinacl para otorgar permisos de usuario para iniciar / detener y consultar el servicio:

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

¿Cómo es que PowerShell no puede detener mi servicio pero sí sc.exepuede?

pedazos salpicados
fuente

Respuestas:

20

Resulta que no estaba dando suficientes permisossubinacl . Los posibles valores de acceso para la acción de concesión son:

    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  

Estaba usando S (estado del servicio de consulta), T (iniciar servicio) y O (detener servicio). También necesitaba E (enumerar servicios dependientes). Parece que los cmdlets de PowerShell deben analizar los servicios dependientes al iniciar / detener.

Aquí está mi subinaclcomando actualizado :

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

Si no desea descargar / usar subinacl.exe, puede usar PowerShell a través de las funciones Grant-ServiceControlPermission o Grant-ServicePermission del módulo Carbon . (DESCARGO DE RESPONSABILIDAD: soy el propietario / mantenedor del proyecto Carbon.)

pedazos salpicados
fuente
Por favor marque esto como su respuesta correcta. Esto fue de gran ayuda para mí exactamente por el mismo problema :)
Alain O'Dea
Nunca he oído hablar de subinaclantes. ¡Qué utilidad tan útil! Gracias por regresar para dejar esta información para el resto de nosotros.
Dan
Funciona muy bien en un entorno sin dominio con servidores Windows 2016 para controlar servicios en computadoras remotas.
Doug Knudsen
0

El siguiente comando funciona como se esperaba en mi máquina con Windows Server 2008 R2.

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

¿También puede probar este comando único para determinar si eso funciona y ha verificado que el usuario es miembro de un grupo que es miembro del grupo Usuarios en los servidores de destino?

Greg Askew
fuente
Tu corte no funciona para mí. Debido a los requisitos de seguridad, no puedo hacer que el usuario sea miembro del grupo de usuarios (o cualquier grupo integrado de Windows).
bits salpicados