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

如何在PowerShell中获取Windows服务账户列表?探讨未被使用的账户情况

在PowerShell中获取Windows服务账户列表及相关疑问解答

这个问题问得很到位!我来帮你理清楚两个核心点:怎么用PowerShell获取服务账户列表,以及是否存在未被任何服务使用的服务账户。

一、获取当前被服务使用的账户列表

目前网上大多数脚本的思路是对的:通过查询Windows服务的StartName属性来获取服务运行账户——因为每个服务都必须指定一个账户来运行它。

这里给你一个更实用的PowerShell命令,能清晰列出所有服务及其对应的运行账户,还可以去重整理:

# 获取所有服务及其运行账户,去重后按账户名排序
Get-CimInstance Win32_Service | 
    Select-Object Name, DisplayName, StartName | 
    Sort-Object StartName -Unique

如果想过滤掉系统默认的内置账户(比如LocalSystem、NT AUTHORITY\NetworkService这类),可以加个过滤条件:

Get-CimInstance Win32_Service | 
    Select-Object Name, DisplayName, StartName | 
    Where-Object { $_.StartName -notin @("LocalSystem", "NT AUTHORITY\NetworkService", "NT AUTHORITY\LocalService") } |
    Sort-Object StartName -Unique

小提示:用Get-CimInstance Win32_Service比Get-Service更合适,因为Get-Service默认不会返回StartName这个关键属性。

二、是否存在未被任何服务使用的服务账户?

答案是肯定存在!

为什么会有这种情况?

服务账户本质上属于Windows的本地用户账户(或域账户),只是这类账户的类型被标记为「服务账户」,它们的创建不一定和服务绑定:

  • 有些软件安装时会自动创建专用服务账户,但卸载软件时可能没清理掉这个账户;
  • 管理员可能手动创建服务账户用于测试,但最终没把它关联到任何服务;
  • 甚至系统自带的部分特殊账户,也可能当前没有任何服务在使用它们。

就像你提到的,打开文件属性的「安全」选项卡时,能看到的账户范围是系统中所有存在的用户/组,这其中就包含了很多没被服务使用的账户。

如何验证并找出这些账户?

可以通过以下PowerShell步骤对比:

  1. 先获取所有服务正在使用的账户列表:
$usedServiceAccounts = (Get-CimInstance Win32_Service).StartName | Where-Object { $_ } | Sort-Object -Unique
  1. 再获取系统中所有类型为「服务账户」的本地账户:
$allLocalServiceAccounts = Get-LocalUser | 
    Where-Object { $_.UserType -eq "Service" } | 
    Select-Object -ExpandProperty Name | 
    ForEach-Object { "NT AUTHORITY\$_" } # 格式化为服务账户的标准名称格式
  1. 最后对比找出未被使用的服务账户:
Compare-Object -ReferenceObject $usedServiceAccounts -DifferenceObject $allLocalServiceAccounts | 
    Where-Object { $_.SideIndicator -eq "=>" } | 
    Select-Object -ExpandProperty InputObject

执行完这三步,你就能得到那些存在于系统中,但没有任何服务在使用的服务账户了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:30:57