CreateProcessAsUser не работает правильно в моих экспериментах - PullRequest
1 голос
/ 26 ноября 2008

Я пытаюсь сделать следующее: 1. Я вошел в систему как учетная запись администратора в моей XP с машиной SP2 под управлением VS.NET 2005 2. У этой машины также есть другая учетная запись user1, которая является гостевой учетной записью 3. Я запускаю программу от имени администратора, из этой программы я хочу запустить процесс notepad.exe, который будет выполняться в контексте безопасности user1 4. Я специально хочу использовать CreateProcessasUser, чтобы сделать это ..

Это фрагмент кода, который объяснит, что я пытался ..

const string GRANTED_ALL = "10000000";

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_BATCH = 4;
const int LOGON32_LOGON_SERVICE = 5;
const int LOGON32_LOGON_UNLOCK = 7;
const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

const int LOGON32_PROVIDER_DEFAULT = 0;
static IntPtr hToken = IntPtr.Zero;
static IntPtr hTokenDuplicate = IntPtr.Zero;

static void Main(string[] args)
{
    int last_error = 0;
    if(LogonUser("user1",null,"#welcome123",
        LOGON32_LOGON_INTERACTIVE, 
        LOGON32_PROVIDER_DEFAULT, out hToken))
    {
        last_error = Marshal.GetLastWin32Error();
        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
        STARTUPINFO si = new STARTUPINFO();
        SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
        last_error = 0;
        last_error = Marshal.GetLastWin32Error();
        if(DuplicateTokenEx(hToken,UInt32.Parse(GRANTED_ALL,System.Globalization.NumberStyles.HexNumber),
            ref sa,SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
            TOKEN_TYPE.TokenPrimary,out hTokenDuplicate))
        {
            last_error = 0;
            last_error = Marshal.GetLastWin32Error();

            CreateProcessAsUser(hTokenDuplicate, "d:\\san\\notepad.exe", null,
            ref sa, ref sa, false, 0, IntPtr.Zero, "d:\\san", ref si, out pi);

            last_error = 0;
            last_error = Marshal.GetLastWin32Error();

        }
    }

    last_error = 0;
    last_error = Marshal.GetLastWin32Error();


    if (hToken != IntPtr.Zero) CloseHandle(hToken);
    if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate);

}

По какой-то причине это не работает .. Функция DuplicateTokenEx возвращается как код ошибки 1305, и я не могу понять, почему ..

Вместо DuplicateTokenEx я также использовал DuplicateToken, теперь CreateProcessAsUser возвращает код ошибки 1308.

Может кто-нибудь, пожалуйста, пролить свет на эту проблему .. Это, кажется, очень простая вещь, но просто не могу понять это правильно .. [Обратите внимание, что я специально хочу LogonUser, а затем DuplicateToken, а затем CreateProcessAsUSer]

1 Ответ

0 голосов
/ 27 ноября 2008

См. CreateProcessAsUser () Windows Station и рабочие столы .

Но я предлагаю сделать это управляемым способом:

...
using System.Diagnostics;
using System.Security;
...
...
string progPath = @"c:\WINNT\notepad.exe";
ProcessStartInfo startInfo = new ProcessStartInfo(progPath);
startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.UseShellExecute = false;
startInfo.UserName = "SomeUser";
SecureString password = new SecureString();

#region setting password
password.AppendChar('p');
password.AppendChar('a');
...
#endregion

startInfo.Password = password;
Process.Start(startInfo);
...
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...