如何在 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 中创建具有密码的用户?

如何在 C# 中创建相对于用户文档的文件目录?

如何在 VBA 的另一个函数中调用我在 VBA 中创建的函数?

如何在Glassfishv4上的另一个Servlet中创建的Servlet中恢复会话?

如何在 AWS 中创建计费用户 [关闭]