如何在 C# 中以另一个用户身份创建一个没有密码的进程?

Pey*_*ang 0 c# windows uac process

我正在尝试用 C# 创建一些类似于 Linux 的 sudo 的东西。我找到了一种使用密码以其他用户身份运行该进程的方法,但我想在没有密码的情况下执行此操作。

另外,我的 C# 软件以管理员身份运行并且已通过 UAC。

我当前的代码:

static void CreateProcessAsUser(string name, string path, SecureString password)
{
    Process proc = new Process();

    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.FileName = path;
    proc.StartInfo.UserName = name;
    proc.StartInfo.Password = password;

    proc.Start();
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Lex*_* Li 5

Windows 不是 Linux,因此您不能指望像 sudo 这样的功能。

无论您使用哪种编程语言(C# 或 C++),在内心深处您都需要调用RunProcessAsUser(不,不是您当前的代码,因为您的代码对于此目的来说太简单了)来初始化作为另一个用户帐户运行的进程。该 API 反过来需要一个用户令牌,您可以通过 使用用户凭据(也称为密码)创建该令牌LogonUser,或者通过 克隆现有令牌DuplicateToken

因此,避免密码的唯一方法是找到该计算机上已有的有效用户令牌(一旦该用户登录)。

您可能想知道哪些应用程序使用如此复杂的机制以及原因。一个例子是防病毒软件,其主要组件是以管理员身份运行的 Windows 服务。该服务检测谁登录到计算机,然后启动托盘图标应用程序。(这是复制用户令牌并以该用户身份创建进程的最佳时机。)

如果你的目标不是涵盖类似的场景,我想知道你是否应该继续走这条路。