You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:修复查询AD服务器并启停服务的PowerShell脚本

解决PowerShell远程启动AD中服务器服务的问题

核心问题分析

你的脚本无法启动服务主要有几个潜在原因:

  1. 使用Select-Object过滤后丢失了完整的ServiceController对象,导致无法直接操作服务;
  2. 可能误将服务的显示名称当作服务名称使用(比如Windows的“Server”显示名称对应服务名称为LanmanServer);
  3. 注释代码存在拼写错误(Get Service应为Get-Service)。

修正后的脚本方案

方案1:保留完整服务对象直接操作

此方案去掉Select-Object,保留完整的服务对象,直接调用其Start()方法启动服务,并添加错误处理:

# 查询AD中名称匹配*SERVER01的服务器
$lSERVER = (Get-ADComputer -Filter 'Name -like "*SERVER01"').name

ForEach ($SERVER in $lSERVER) 
{
    Write-Host "Checking services on [$($SERVER)]" -ForegroundColor Cyan
    # 获取完整的远程服务对象(去掉Select-Object,保留可操作的ServiceController实例)
    $lServices = Get-Service -ComputerName $SERVER -Name "LanmanServer" # 注意:此处替换为实际服务名称,默认"Server"显示名称对应LanmanServer
    
    foreach($Service in $lServices)
    {
        if($Service.Status -eq "Stopped")
        {
            Write-Host "[$($Service.Name)] is currently in a [$($Service.Status)] state." -ForegroundColor Red
            try {
                # 启动服务并等待启动完成(超时1分钟)
                $Service.Start()
                $Service.WaitForStatus('Running', '00:01:00')
                Write-Host " [$($Service.Name)] started successfully on [$SERVER]" -ForegroundColor Green
            } catch {
                Write-Host " Failed to start [$($Service.Name)] on [$SERVER]: $_" -ForegroundColor Red
            }
        }
        else
        {
            Write-Host "[$($Service.Name)] is currently in a [$($Service.Status)] state." -ForegroundColor Green
        }
    }
}

方案2:保留属性过滤,重新获取服务对象启动

如果你需要保留Select-Object的属性输出,可以在启动时重新获取完整服务对象:

$lSERVER = (Get-ADComputer -Filter 'Name -like "*SERVER01"').name

ForEach ($SERVER in $lSERVER) 
{
    Write-Host "Checking services on [$($SERVER)]" -ForegroundColor Cyan
    $lServices = Get-Service -ComputerName $SERVER -Name "LanmanServer" | Select-Object Status,Name,Displayname,MachineName
    
    foreach($Service in $lServices)
    {
        if($Service.Status -eq "Stopped")
        {
            Write-Host "[$($Service.Name)] is currently in a [$($Service.Status)] state." -ForegroundColor Red
            try {
                # 重新获取完整服务对象并启动,等待启动完成
                Get-Service -ComputerName $SERVER -Name $Service.Name | 
                    Set-Service -Status Running -PassThru | 
                    Wait-Service -Timeout 60
                Write-Host " [$($Service.Name)] started successfully on [$SERVER]" -ForegroundColor Green
            } catch {
                Write-Host " Failed to start [$($Service.Name)] on [$SERVER]: $_" -ForegroundColor Red
            }
        }
        else
        {
            Write-Host "[$($Service.Name)] is currently in a [$($Service.Status)] state." -ForegroundColor Green
        }
    }
}

关键注意事项

  • 服务名称确认:务必使用服务的实际名称而非显示名称。可在目标服务器执行Get-Service | Where-Object DisplayName -eq "Server"查看对应服务名称,默认“Server”显示名称对应LanmanServer。
  • 权限要求:运行脚本的账号必须拥有目标服务器的本地管理员权限,否则无法远程启动服务。
  • 网络与防火墙:目标服务器需允许WMI/SMB相关端口(135、445)通信,或配置WinRM服务以支持远程PowerShell操作。

内容的提问来源于stack exchange,提问作者user3069802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:24:53