如何在 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 服务 运行 作为管理员。此服务检测谁登录到机器,然后启动托盘图标应用程序。 (这是复制用户令牌并作为该用户创建进程的最佳时机。)
如果你的目标不是涵盖类似的场景,我想知道你是否应该继续这条路。
我正在尝试在 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 服务 运行 作为管理员。此服务检测谁登录到机器,然后启动托盘图标应用程序。 (这是复制用户令牌并作为该用户创建进程的最佳时机。)
如果你的目标不是涵盖类似的场景,我想知道你是否应该继续这条路。