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

How to create a process as a another user without a password in C#?

我正在尝试在 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();
}

谢谢。

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

无论您使用哪种编程语言(C# 或 C++),在内心深处您都需要调用 RunProcessAsUser (no, not your current code as yours is far too simple for the purpose) to initialize a process running as another user account. This API in turn wants a user token, which you either create with user credentials (aka password) via LogonUser, or clone from an existing token via DuplicateToken

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

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

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