Почему Process.Start генерирует Win32Exception, если используются разные учетные данные пользователя? - PullRequest
3 голосов
/ 09 ноября 2010

Мне нужно запустить процесс как другой пользователь, и это бомбардировка.

Я уменьшил код до простого справочного примера.Этот код отлично работает, чтобы запустить сам процесс:

        var info = new ProcessStartInfo("notepad.exe")
                       {
                           UseShellExecute = false,
                           RedirectStandardInput = true,
                           RedirectStandardError = true,
                           RedirectStandardOutput = true
                       };

Однако, если я добавлю значения UserName и Password:

       var info = new ProcessStartInfo("notepad.exe")
                       {
                           UserName = "user",
                           Password = StringToSecureString("password"),
                           UseShellExecute = false,
                           RedirectStandardInput = true,
                           RedirectStandardError = true,
                           RedirectStandardOutput = true
                       };
        Process.Start(info);

Это бомбы с очень полезнымSystem.ComponentModel.Win32Exception message:

Служба не может быть запущена, либо потому, что она отключена, либо из-за того, что с ней не связано ни одного подключенного устройства.

На всякий случайВот метод безопасного преобразования строк:

    private static SecureString StringToSecureString(string s)
    {
        var secure = new SecureString();
        foreach (var c in s.ToCharArray())
        {
            secure.AppendChar(c);
        }
        return secure;
    }

Любые идеи или альтернативные решения будут очень благодарны!

Ответы [ 2 ]

5 голосов
/ 09 ноября 2010

Запущена ли ваша Secondary Logon служба, я полагаю, это необходимо для запуска нового процесса под другой учетной записью пользователя?

0 голосов
/ 09 ноября 2010

Я думаю, что вы, вероятно, пропускаете свойство Domain в ProcessStartInfo.

Сравните ваш код с примером, приведенным в документах :

Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);

           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();

        try
        {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...