使用特定用户帐户运行Windows应用程序

时间:2011-05-19 16:49:06

标签: c# windows exe application-settings

我需要确保我的widnows app(winform not console)在某个用户帐户下运行(换句话说,任何用户都可以登录到该机器,但.e​​xe将始终以指定用户身份执行)。

这可以通过程序化完成吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:4)

您可以像这样启动应用程序:

ProcessStartInfo psi = new ProcessStartInfo(myPath);
psi.UserName = username;

SecureString ss = new SecureString();
foreach (char c in password)
{
 ss.AppendChar(c);
}

psi.Password = ss;
psi.UseShellExecute = false;
Process.Start(psi);

答案 1 :(得分:1)

您可以在应用中执行的一项操作是检查您是否以所需用户身份运行,如果没有,请创建与其他用户一样的新应用实例。然后第一个实例将退出。

要检查您正在运行的用户,您可以调整here的解决方案,以便进程查询自己的令牌信息。

使用CreateProcessWithLogonW,传递LOGON_WITH_PROFILE登录标记。您登录的用户必须具有允许以交互方式登录的相应策略。

编辑:既然你已经表明你正在使用.NET,那么你应该怎么做:

首先,您需要找出您当前正在运行的用户。使用System.Security.Principal命名空间中的WindowsIdentity类。调用其GetCurrent方法以获取您正在运行的用户的WindowsIdentity对象。 Name属性将为您提供正在运行的实际用户名。

ProcessStartInfo对象中,设置LoadUserProfile = trueFileName字段,可能是Arguments字段,UserNamePassword字段,可能是Domain字段,并设置UseShellExecute = false。然后拨打Process.Start(),传入ProcessStartInfo对象。

这是一个我把它放在一起的示例,但我没有安装C#编译器来测试它:

using System;
using System.Diagnostics;
using System.Security;
using System.Security.Principal;

// Suppose I need to run as user "foo" with password "bar"

class TestApp
{
    static void Main( string[] args )
    {
        string userName = WindowsIdentity.GetCurrent().Name;
        if( !userName.Equals( "foo" ) ) {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "testapp.exe";
            startInfo.UserName = "foo";

            SecureString password = new SecureString();
            password.AppendChar( 'b' );
            password.AppendChar( 'a' );
            password.AppendChar( 'r' );
            startInfo.Password = password;

            startInfo.LoadUserProfile = true;
            startInfo.UseShellExecute = false;

            Process.Start( startInfo );    
            return;
        }
        // If we make it here then we're running as "foo"
    }
}