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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:35:24