我需要确保我的Windows应用程序(WinForm而不是控制台)在特定用户帐户下运行(换句话说,任何用户都可以登录到机器上,但.exe将始终作为指定的用户执行)。
这是否可以通过编程实现?如果可以,如何实现?
这是否可以通过编程实现?如果可以,如何实现?
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);
你可以在你的应用程序中做一件事情,就是检查你是否作为所需用户运行,如果不是,则创建一个新的应用程序实例作为另一个用户。第一个实例将退出。
要检查你正在以哪个用户身份运行,你可以改编这里的解决方案,使进程查询其令牌信息。
使用CreateProcessWithLogonW
,传递LOGON_WITH_PROFILE
登录标志。你要登录的用户必须具有适当的策略设置,才能允许交互式登录。
编辑:现在你已经表明你正在使用.NET,下面是你应该如何做:
首先,您需要找出当前正在运行的用户。使用System.Security.Principal
命名空间中的WindowsIdentity
类。调用其GetCurrent
方法以获取您正在运行的用户的WindowsIdentity
对象。Name
属性将为您提供实际的用户名。
ProcessStartInfo
对象中,设置LoadUserProfile=true
,FileName
字段,可能还有Arguments
字段,UserName
和Password
字段,可能还有Domain
字段,并设置UseShellExecute=false
。 然后调用Process.Start()
,传入您的ProcessStartInfo
对象。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"
}
}