Como posso instalar ou desinstalar remotamente um serviço no Windows Server 2008 R2?

2

Quem sabe uma solução simples como instalar ou desinstalar um serviço do Windows remotamente em um servidor Win2k8R2?

Este servidor é hospedado na Internet, por isso não está em um domínio ou algo semelhante. Assim, eu quero evitar o uso de compartilhamento de arquivos do Windows ou serviços de administração.

Eu preferiria uma possibilidade em que eu pudesse acionar a execução de um script do lado do servidor que instalasse os binários de serviço já enviados.

Você pode nomear quaisquer ferramentas ou soluções de código .NET se souber como fazer isso.

Edit: Desculpe, tenho que esclarecer um pouco, não é tão fácil quanto usar o powershell ou o script com o InstallUtil no meu caso. Vou tentar com marcadores:

  • Desejo instalar um serviço sem assistência, invocando a instalação do serviço em um servidor, executando na Internet, de um cliente.
  • Eu não tenho uma GUI do servidor enquanto invoco a instalação do serviço. Por exemplo, eu disparo um setup.exe, que instala os serviços em si via SSH (serviço de auto-instalação para fazer uso de nomes de serviços personalizados). Não ter uma interface gráfica parece ser um problema (?).

Eu até tentei desesperadamente invocar o programa de configuração do serviço através de um serviço web php (shell_exec), mas o resultado é sempre o mesmo: o Setup é executado, mas nenhum serviço é instalado.

Para o cliente, deve ser o mais fácil possível invocar a instalação do serviço no servidor, sem ver nada dele. É para uma implantação periódica e automatizada de alguns aplicativos baseados em serviços que criamos.

    
por derFunk 20.09.2011 / 16:42

2 respostas

2

Eu fiz isso recentemente usando o PowerShell e o WMI. Detalhes completos aqui mas em um Em poucas palavras, algo como o abaixo funciona, bem como o PowerShell ou SC.exe

function Install-Service(
[string]$serviceName = $(throw "serviceName is required"),
[string]$targetServer = $(throw "targetServer is required"),
[string]$displayName = $(throw "displayName is required"),
[string]$physicalPath = $(throw "physicalPath is required"),
[string]$userName = $(throw "userName is required"),
[string]$password = "",
[string]$startMode = "Automatic",
[string]$description = "",
[bool]$interactWithDesktop = $false
)
{        
# todo: cleanup this section
$serviceType = 16          # OwnProcess
$serviceErrorControl = 1   # UserNotified
$loadOrderGroup = $null
$loadOrderGroupDepend = $null
$dependencies = $null

# description?
$params = '
    $serviceName, '
    $displayName, '
    $physicalPath, '
    $serviceType, '
    $serviceErrorControl, '
    $startMode, '
    $interactWithDesktop, '
    $userName, '
    $password, '
    $loadOrderGroup, '
    $loadOrderGroupDepend, '
    $dependencies '

$scope = new-object System.Management.ManagementScope("\$targetServer\root\cimv2", '
    (new-object System.Management.ConnectionOptions))
"Connecting to $targetServer"
$scope.Connect()
$mgt = new-object System.Management.ManagementClass($scope, '
    (new-object System.Management.ManagementPath("Win32_Service")), '
    (new-object System.Management.ObjectGetOptions))

$op = "service $serviceName ($physicalPath) on $targetServer"   
"Installing $op"
$result = $mgt.InvokeMethod("Create", $params)   
Test-ServiceResult -operation "Install $op" -result $result
"Installed $op"

"Setting $serviceName description to '$description'"
Set-Service -ComputerName $targetServer -Name $serviceName -Description $description
"Service install complete"
}
    
por 23.03.2012 / 15:36
2

O Powershell parece ser uma opção provável. Dê uma olhada na referência de cmdlet e na Add-WindowsFeature cmdlet

    
por 20.09.2011 / 17:55