如何在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步骤对比:
- 先获取所有服务正在使用的账户列表:
$usedServiceAccounts = (Get-CimInstance Win32_Service).StartName | Where-Object { $_ } | Sort-Object -Unique
- 再获取系统中所有类型为「服务账户」的本地账户:
$allLocalServiceAccounts = Get-LocalUser | Where-Object { $_.UserType -eq "Service" } | Select-Object -ExpandProperty Name | ForEach-Object { "NT AUTHORITY\$_" } # 格式化为服务账户的标准名称格式
- 最后对比找出未被使用的服务账户:
Compare-Object -ReferenceObject $usedServiceAccounts -DifferenceObject $allLocalServiceAccounts | Where-Object { $_.SideIndicator -eq "=>" } | Select-Object -ExpandProperty InputObject
执行完这三步,你就能得到那些存在于系统中,但没有任何服务在使用的服务账户了。
内容的提问来源于stack exchange,提问作者as9876
相关产品推荐
相关产品推荐

