Запустите приложение Windows, используя определенную учетную запись пользователя - PullRequest
3 голосов
/ 19 мая 2011

Мне нужно убедиться, что мое приложение widnows (winform не консоль) работает под определенной учетной записью пользователя (другими словами, любой пользователь может войти в систему, но .exe всегда будет выполняться как указанный пользователь).

Можно ли это сделать программно?Если так, то как?

Ответы [ 2 ]

4 голосов
/ 20 мая 2011

Вы можете запустить приложение так:

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 голос
/ 19 мая 2011

Одна вещь, которую вы могли бы сделать в своем приложении, это проверить, работаете ли вы от имени нужного пользователя, а если нет, создать новый экземпляр вашего приложения от имени этого другого пользователя. Первый экземпляр затем завершится.

Чтобы проверить, с каким пользователем вы работаете, вы можете адаптировать решение с здесь так, чтобы процесс запрашивал информацию о своем токене.

Используйте 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"
    }
}
...