我创建了一个脚本,根据它的显示名称启动或停止服务。我的脚本在本地计算机上运行,但我想确保它可以在远程计算机和本地计算机上完成。我不知道如何让它在远程机器上工作。
任何帮助将不胜感激。
int result = (n % 2 == 1) ? k : 0;
答案 0 :(得分:2)
您无法将Start-Service
/ Stop-Service
用于远程计算机,但您可以从Get-Service
(使用ComputerName
参数)传递服务对象Set-Service
可以为远程计算机执行相同的启动/停止操作:
Get-Service $ServiceName -ComputerName $ComputerName | Set-Service -Status Running
我发现这比使用PowerShell Remoting或WMI命令容易得多。
您可以使用最少的代码更改轻松更新代码:
$serviceName = Read-Host -Prompt 'Please enter service name: '
#get computername or use localhost for local computer
if(($ComputerName = Read-Host 'Enter Computer Name, leave blank for local computer') -eq ''){$ComputerName = 'localhost'}
$Service = Get-Service -DisplayName $serviceName -ComputerName $ComputerName -ErrorAction SilentlyContinue
# Check that service name exists
if ($Service) {
# Check that service name is not empty
if([string]::IsNullOrEmpty($serviceName)){Write-Host 'Service name is NULL or EMPTY'}
else {
$Choice = Read-Host -Prompt 'Would you like to start or stop the service'
#Start service
If ($Choice -eq 'start') {
$Service | Set-Service -Status Running
Write-Host $serviceName 'Starting...' -ForegroundColor Green
}
#Stop service
If ($Choice -eq 'stop') {
$Service | Set-Service -Status Stopped
Write-Host $serviceName 'Stopping...' -ForegroundColor Green
}
}
}
else {
Write-Host 'Service name does not exist'
}
答案 1 :(得分:1)
假设您尚未禁用PowerShell远程处理,最简单的方法是将其包含在ComputerName
作为可选参数的函数中,然后使用Invoke-Command
和splat {{1} }。
PSBoundParameters
然后你可以在没有参数的情况下调用Function Toggle-Service{
[cmdletbinding()]
Param([string[]]$ComputerName)
$serviceName = Read-Host -Prompt 'Please enter service name: '
# Check that service name exists
If (Invoke-Command -ScriptBlock {Get-Service $serviceName -ErrorAction SilentlyContinue} @PSBoundParameters)
{
# Check that service name is not empty
if([string]::IsNullOrEmpty($serviceName))
{
Write-Host "Service name is NULL or EMPTY"
}
else
{
$Choice = Read-Host -Prompt 'Would you like to start or stop the service'
#Start service
If ($Choice -eq 'start') {
Invoke-Command -ScriptBlock {Start-Service -displayname $serviceName} @PSBoundParameters
Write-Host $serviceName "Starting..." -ForegroundColor Green
}
#Stop service
If ($Choice -eq 'stop') {
Invoke-Command -ScriptBlock {Stop-Service -displayname $serviceName} @PSBoundParameters
Write-Host $serviceName "Stopping..." -ForegroundColor Green
}
}
}
else {
Write-Host "Service name does not exist"
}
}
来在本地执行它,或者包含远程服务器的名称以在该服务器上执行操作。
答案 2 :(得分:0)
Start-Service
和Stop-Service
不适用于远程计算机。您将需要进行PowerShell远程处理或使用WMI。在我的环境中,PowerShell远程处理默认被阻止,但我们使用WMI代替;通过Get-WMIObject
检索的服务对象有一个名为Start-Service()
的方法,可以在检索到的服务对象上调用:
(Get-WmiObject -ComputerName $ComputerName -Class Win32_Service -Filter "Name='$ServiceName'").StartService()
使用WMI在远程计算机上停止服务的方式相同;您可以改为调用服务对象的StopService()
方法。
我建议您阅读Get-Help Get-WMIObject
和the MSDN reference on the Win32_Service class中的信息。
ETA:应该注意的是,通过省略-ComputerName
参数,WMI也可以在本地计算机上运行。