Одна вещь, которую вы могли бы сделать в своем приложении, это проверить, работаете ли вы от имени нужного пользователя, а если нет, создать новый экземпляр вашего приложения от имени этого другого пользователя. Первый экземпляр затем завершится.
Чтобы проверить, с каким пользователем вы работаете, вы можете адаптировать решение с здесь так, чтобы процесс запрашивал информацию о своем токене.
Используйте CreateProcessWithLogonW
, передавая флаг входа LOGON_WITH_PROFILE
. Пользователь, в который вы входите, должен иметь соответствующие политики, разрешенные для интерактивного входа.
РЕДАКТИРОВАТЬ: Теперь, когда вы указали, что используете .NET, вот как вы должны это сделать:
Сначала вам необходимо выяснить, от какого пользователя вы в данный момент работаете. Используйте класс WindowsIdentity
из пространства имен System.Security.Principal
. Вызовите метод 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"
}
}