我需要确保我的widnows app(winform not console)在某个用户帐户下运行(换句话说,任何用户都可以登录到该机器,但.exe将始终以指定用户身份执行)。
这可以通过程序化完成吗?如果是这样,怎么样?
答案 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
登录标记。您登录的用户必须具有允许以交互方式登录的相应策略。
首先,您需要找出您当前正在运行的用户。使用System.Security.Principal
命名空间中的WindowsIdentity
类。调用其GetCurrent
方法以获取您正在运行的用户的WindowsIdentity
对象。 Name
属性将为您提供正在运行的实际用户名。
在ProcessStartInfo
对象中,设置LoadUserProfile = true
,FileName
字段,可能是Arguments
字段,UserName
和Password
字段,可能是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"
}
}