Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以不同用户身份运行应用程序_C#_.net_Wpf_Xaml - Fatal编程技术网

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

C# 以不同用户身份运行应用程序,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我想以不同的用户身份运行我的项目,但我看到的所有解决方案都是以不同的用户身份启动流程。我想将用户名硬编码到项目中,以便每次运行程序时都以该用户的身份运行。我之所以需要它,是为了让在我的网络上没有权限的用户能够启动和停止服务器上的服务 因此,我需要将用户名和密码安全地存储在程序中,以便每次运行时都以该用户的身份运行 正如我之前所说的,我之前发现的只是为了启动一些外部进程而模拟用户,但我需要它来启动该用户 编辑 我已经找到了问题的解决方案,它是PsExec。您需要更改应用程序池标识。进入Advanc

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

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

正如我之前所说的,我之前发现的只是为了启动一些外部进程而模拟用户,但我需要它来启动该用户

编辑


我已经找到了问题的解决方案,它是PsExec。

您需要更改应用程序池标识。进入Advanced,查找标识,选择custom account并输入凭据

编辑:我猜你一开始是在一个IIS senario里。因为您将需求更改为WPF,所以这个答案将不起作用。请不要理会


谢谢

您可以使用不同的用户凭据启动新流程(请参阅:)。因此,一种可能的解决方案是,检查是否向应用程序传递了命令行参数(例如,“/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);
}
如果(!Environment.GetCommandLineArgs()包含(“/runAsOther”))
{
var进程=新进程();
var securePassword=new SecureString();
process.StartInfo.UseShellExecute=false;
process.StartInfo.FileName=“应用程序路径”;
process.StartInfo.Arguments=“/runAsOther”;
process.StartInfo.Domain=“域名”;
process.StartInfo.UserName=“UserName”;
var password=“test”;
for(int x=0;x

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


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

还有一些其他替代方法可以帮助实现这一点,如PsExex工具。

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

有关更多信息:-

例如psexec\workstation64-c test.bat-u USERNAME-p PASSWORD


它在我的情况下没有任何问题。

也许你正在寻找?(免责声明:我写了链接文章)感谢您的快速回复:)我会马上看一看,并告诉您这对我是否有效。我看了代码和解释,但据我所知,这只是一个临时解决方案,因为它只会执行括号内的代码。我需要整个项目以不同的用户身份运行。使用(新的模拟程序(“myUsername”、“myDomainname”、“myPassword”){…<在新上下文下执行的代码>…},所以您需要使用项目中包含的凭据运行“整个项目”?是的,没错@斯图尔特,你知道这是否可行吗?这并不能回答问题。问题是关于WPF应用程序的。NET应用程序比IIS中的ASP.NET页面多一点,你知道吗?桌面应用程序没有可配置的应用程序池。像这样的东西正是我想要的,但我担心@ThorstenDittmar是对的。。。我需要这样做,但在代码中。。我目前正在尝试实施由建议的解决方案,但我在理解模拟如何工作时遇到一些困难。当事情不清楚/不明确时,我通常不会猜测,而是询问。谢谢您的回复,但正如我在问题中所说,我知道这一点,但它只在外部运行应用程序,我想知道是否有一种方法可以在项目中写入此内容,并且在激活应用程序的exe文件后,它将自动使用其他用户的登录凭据。非常感谢您的回答!PsExec正是我所需要的:)