如何在 C# 中创建一个没有密码的另一个用户的进程?
Posted
技术标签:
【中文标题】如何在 C# 中创建一个没有密码的另一个用户的进程?【英文标题】:How to create a process as a another user without a password in C#? 【发布时间】:2022-01-01 12:23:54 【问题描述】:我正在尝试在 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();
谢谢。
【问题讨论】:
让我们称您的软件尝试以 user2 身份运行进程的用户。 user2 的帐户是否有密码,并且您试图让您的代码在不知道该密码的情况下运行进程?还是user2根本没有密码? 是前者。 User2 有密码认证。该进程以管理员权限运行,所以我认为这是可能的,但不是吗? 【参考方案1】:Windows 不是 Linux,所以你不能指望像 sudo 这样的功能。
无论您使用哪种编程语言(C# 或 C++),您都需要在内心深处调用RunProcessAsUser
(不,不是您当前的代码,因为您的代码太简单了)来初始化一个作为另一个运行的进程用户帐号。该 API 反过来需要一个用户令牌,您可以通过 LogonUser
使用用户凭据(也称为密码)创建该令牌,或者通过 DuplicateToken
从现有令牌克隆。
因此,避免密码的唯一方法是在这台机器上找到一个有效的用户令牌(一旦该用户登录)。
您可能想知道哪些应用程序使用如此复杂的机制以及为什么。一个例子是您的防病毒软件,其主要组件是以管理员身份运行的 Windows 服务。该服务检测谁登录到机器,然后启动托盘图标应用程序。 (这是复制用户令牌并以该用户身份创建进程的最佳时机。)
如果你的目标不是涵盖类似的场景,我想知道你是否应该继续走这条路。
【讨论】:
除了 Lex 的回答,这里有进一步的阅读来帮助解释它:***.com/questions/125341/…以上是关于如何在 C# 中创建一个没有密码的另一个用户的进程?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有用户名/密码的nodejs中创建JWT用户/访问令牌?
如何使用 REST API 在 Keycloak 中创建具有密码的用户?
如何在 VBA 的另一个函数中调用我在 VBA 中创建的函数?