以不同用户身份运行应用程序

Posted

技术标签:

【中文标题】以不同用户身份运行应用程序【英文标题】:Running an application as different user 【发布时间】:2016-06-27 11:49:17 【问题描述】:

我想以不同的用户身份运行我的项目,但我看到的所有解决方案都是以不同的用户身份启动进程。我想将用户名硬编码到项目中,以便每次运行程序时都以该用户身份运行。我需要这个的原因是为了让在我的网络上没有权限的用户能够启动和停止服务器上的服务。

所以我需要将用户名和密码安全地存储在程序中,以便每次运行时都以该用户身份运行。

正如我之前所说,我之前发现的只是为了启动一些外部进程而冒充用户,但我需要它从该用户开始。

编辑

我找到了解决问题的方法,那就是 PsExec。

【问题讨论】:

也许您正在寻找impersonation? (免责声明:我写了链接的文章) 感谢您的快速回复 :) 我会立即查看并告诉您这是否对我有用。 我查看了代码和解释,但据我所知,这只是一个临时解决方案,因为它只会执行括号内的代码。我需要以不同的用户身份运行整个项目。 using (new Impersonator("myUsername", "myDomainname", "myPassword")) ... ... 那么您需要使用包含在项目中的凭据来运行您的“整个项目”吗? 是的,完全正确。 @stuartd 你知道这是否可能吗? 【参考方案1】:

还有其他一些替代方法可以帮助实现这一目标,例如 PsExex 工具。 https://technet.microsoft.com/en-us/sysinternals/psexec.aspx

您可以从 Process 类提供所需的参数(如用户名、密码、要启动的进程),它将使用这些用户凭据成功启动它。

更多信息:- https://social.technet.microsoft.com/Forums/scriptcenter/en-US/e20ddf85-26ba-45a7-a987-89de076eda23/solved-run-program-as-different-user-through-batch-file?forum=ITCG

例如psexec \workstation64 -c test.bat -u 用户名 -p 密码

在我的情况下它可以正常工作。

【讨论】:

非常感谢您的回答! PsExec 正是我所需要的 :)【参考方案2】:

您可以使用不同的用户凭据启动新进程(请参阅:ProcessStart)。因此,一种可能的解决方案是检查是否将命令行参数传递给应用程序(例如“/runAsOther”)。如果没有,请使用所需用户在新进程中再次启动应用程序并传递命令行参数“/runAsOther”。

代码示例:

if (!Environment.GetCommandLineArgs().Contains("/runAsOther"))

    var process = new Process();
    var securePassword = new SecureString();
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = "path to you application";
    process.StartInfo.Arguments = "/runAsOther";
    process.StartInfo.Domain = "domainname";
    process.StartInfo.UserName = "username";
    var password = "test";
    for (int x = 0; x < password.Length; x++)
        securePassword.AppendChar(password[x]);
    process.StartInfo.Password = securePassword;
    process.Start();
    Environment.Exit(1);


所以我需要将用户名和密码安全地存储在程序中,以便每次运行时都以该用户身份运行。

在应用程序中安全存储密码是不可能的,也不推荐。但是,您可以做的最好的事情是使用特定于机器的算法对其进行解密(例如,使用 DataProtector 类)。

【讨论】:

感谢您的回复,但正如我在问题中所说的,我知道这一点,但它只在外部运行应用程序我想知道是否有办法在项目中和之后编写这个激活应用程序的 exe 文件,它将自动使用其他用户的登录凭据。【参考方案3】:

您需要更改您的应用程序池标识。进入高级,查找身份,选择自定义帐户并输入凭据。

编辑:我猜你一开始是在 IIS 环境中。由于您将要求更改为 WPF,因此此答案将不起作用。请无视。

谢谢

【讨论】:

这没有回答问题。问题是关于 WPF 应用程序的。 .NET 应用程序比 IIS 中的 ASP.NET 页面多一点,你知道吗?桌面应用程序没有可配置的应用程序池。 这样的东西正是我正在寻找的,但我担心@ThorstenDittmar 是对的......我需要这样做,但在代码中......我目前正在尝试实现一个解决方案这是由建议的,但我在理解模拟的工作原理时遇到了一些困难。 当事情不清楚/模棱两可时,我通常不会猜测而是询问。

以上是关于以不同用户身份运行应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 以不同的用户身份运行

无法以不同用户身份运行 C# 进程

如何在 IntelliJ 中以不同用户身份运行 JAR 应用程序?

如何以不同用户和管理员身份从命令提示符运行程序 [关闭]

您可以以编程方式打开“以不同用户身份运行”对话框吗?

以不同用户身份运行程序(使用CreateProcessAsUser函数)cool