谁知道如何在 Win2k8R2 服务器上远程安装或卸载 Windows 服务的简单解决方案?
此服务器托管在互联网上,因此不在域或类似位置。因此,我想避免使用 Windows 文件共享或管理服务。
我希望能够触发安装已上传的服务二进制文件的服务器端脚本的执行。
如果您知道如何实现这一点,欢迎您说出任何工具或.NET 代码解决方案。
编辑:抱歉,我必须澄清一点,就我的情况而言,这并不像使用 powershell 或使用 InstallUtil 编写脚本那么简单。我将尝试以下要点:
- 我想通过从客户端调用在互联网上运行的服务器上的服务安装来无人值守地安装服务。
- 调用服务安装时,服务器没有 GUI。例如,我触发 setup.exe,它会通过 SSH 自行安装服务(自行安装服务以利用自定义服务名称)。没有 GUI 似乎是一个问题(?)。
我甚至拼命尝试通过 php web 服务(shell_exec)调用服务安装程序,但结果始终是一样的:执行了安装程序,但没有安装任何服务。
对于客户端来说,应该尽可能轻松地调用服务器上的服务安装,而无需看到任何内容。这是为了定期自动部署我们创建的一些基于服务的应用程序。
答案1
我最近使用 PowerShell 和 WMI 完成了此操作。详细信息这里但简而言之,下面的方法以及 PowerShell 远程处理或执行程序
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"
}
答案2
Powershell 似乎是一个不错的选择。看一下cmdlet 参考和添加Windows功能命令