如何在C#中获取PowerShell命令结果并处理用户状态
获取PowerShell命令输出并在C#中处理活跃本地用户
我开发了一个尝试获取所有已启用本地用户的C#应用,但不知道如何获取PowerShell命令的输出结果并在代码中进一步处理。我的需求是筛选出活跃(已启用)用户,后续基于这些用户开展开发,同时要删除非活跃用户。
简言之,核心问题是:如何获取外部命令的输出并在应用程序中进行后续处理?
原代码如下:
static void Main(string[] args) { GetUserList(); } public static string GetUserList() { SelectQuery query = new SelectQuery("Win32_UserAccount"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject User in searcher.Get()) { Process cmd = new Process(); cmd.StartInfo.FileName = @"powershell "; cmd.StartInfo.Arguments = $@"Get-LocalUser -Name {(string)User["Name"]} | Where-Object Enabled"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.Start(); cmd.WaitForExit(); } return null; }
编辑补充
感谢@mklement0的提示,通过命令 (Get-LocalUser -Name {(string)User["Name"]}).Enabled 可以直接获取单个用户的启用状态(返回True或False)。
解决方案
1. 如何获取PowerShell命令的输出
在启动Process后,通过StandardOutput.ReadToEnd()读取命令的标准输出,同时建议读取StandardError避免进程死锁:
cmd.Start(); string output = cmd.StandardOutput.ReadToEnd(); string error = cmd.StandardError.ReadToEnd(); cmd.WaitForExit(); // 处理输出结果,比如解析是否为启用状态 if (!string.IsNullOrEmpty(output)) { // 这里可以根据输出内容判断用户是否启用 }
2. 更高效的实现方案
原代码循环为每个用户启动一次PowerShell进程,效率极低。推荐两种优化方式:
方式一:直接通过WMI筛选已启用用户
无需调用PowerShell,直接在WMI查询中添加条件,一次性获取所有已启用用户:
public static List<string> GetEnabledLocalUsers() { List<string> enabledUsers = new List<string>(); // 直接筛选Enabled属性为True的用户 SelectQuery query = new SelectQuery("Win32_UserAccount", "Enabled = True"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject user in searcher.Get()) { enabledUsers.Add((string)user["Name"]); // 这里可以直接处理用户对象,比如删除非活跃用户的逻辑(注意权限) } return enabledUsers; }
方式二:批量调用PowerShell获取所有已启用用户
一次性执行PowerShell命令获取所有启用用户,避免多次进程启动:
public static List<string> GetEnabledLocalUsersViaPowerShell() { List<string> enabledUsers = new List<string>(); Process cmd = new Process(); cmd.StartInfo.FileName = "powershell"; // 一次性获取所有已启用的本地用户,输出仅用户名 cmd.StartInfo.Arguments = @"Get-LocalUser | Where-Object Enabled | Select-Object -ExpandProperty Name"; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.RedirectStandardError = true; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.Start(); string output = cmd.StandardOutput.ReadToEnd(); cmd.WaitForExit(); if (!string.IsNullOrEmpty(output)) { // 按行分割输出,得到每个启用的用户名 enabledUsers.AddRange(output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)); } return enabledUsers; }
3. 删除非活跃用户的注意事项
- 操作用户账户需要管理员权限,确保程序以管理员身份运行
- 避免删除系统关键账户(如Administrator、DefaultAccount等),建议在代码中添加白名单过滤
内容的提问来源于stack exchange,提问作者AliExpresz
相关产品推荐
相关产品推荐

