С# - Запуск нового процесса от имени пользователя с пустым паролем

У меня есть дочерний процесс, который я порождаю из своего основного приложения, который нужно запустить как другого локального пользователя на компьютере с Windows 7. Я бы предпочел не устанавливать пароль для этой учетной записи пользователя, но кажется, что создание нового процесса с олицетворением не позволяет использовать пустые пароли или нулевые значения любого типа. Кто-нибудь знает, возможно ли это?

ниже была моя попытка передать пустой символ:

ProcessStartInfo info = new ProcessStartInfo(@"C:\PathToExecutable");
System.Security.SecureString psswd = new System.Security.SecureString();
psswd.AppendChar('\0');
psswd.MakeReadOnly();

info.UseShellExecute = false;
info.UserName = "NewProcessName";
info.Password = psswd;
info.Domain = "LocalMachine";

Process newProc = new Process();
newProc.StartInfo = info;

newProc.Start();

редактировать: сообщение об ошибке, которое я получаю

Logon failure: user account restriction. Possible reasons are blank passwords not allowed, logon hour restrictions, or a policy restriction has been enforced


person kmfk    schedule 30.08.2010    source источник


Ответы (4)


Что вы используете для подражания? LogonUser() должен разрешать пустой пароль.

Я не думаю, что вызов psswd.AppendChar('\0') — это правильный способ указать пустой пароль. Попробуйте удалить SecureString из своего кода, чтобы увидеть, сможете ли вы, по крайней мере, заставить работать олицетворение. Затем добавьте SecureString обратно, чтобы увидеть, не кроется ли ваша проблема в этом.

* Изменить *

Попробуй это:

unsafe {
    char* ary = stackalloc char[0];
    SecureString str = new SecureString(ary, 0);
}

установите info.Password в свою новую SecureString... не уверен, придется ли вам делать это в контексте unsafe или нет.

person James King    schedule 30.08.2010
comment
Если я решу не указывать пароль (пропустив StartInfo.Password), я получу то же сообщение. Если я зайду в панель управления и изменю учетную запись пользователя и добавлю пароль (используя символ «A» для тестирования), я могу передать «A» в качестве пароля через SecureString, и это работает нормально. Просто не хотел ставить пароль... - person kmfk; 31.08.2010
comment
Пробовали ли вы вызывать перегруженную функцию Start(), которая принимает имя пользователя, pw и домен, и передавать туда пустой пароль? Я ожидал такого же результата, но не оставляя камня на камне... - person James King; 31.08.2010
comment
Проблема в том, что StartInfo.Password — это System.Security.SecureString, поэтому даже для перегруженного Start() требуется System.Security.SecureString, а не просто строка, которая не может быть пустой. Я довольно близок к тому, чтобы просто установить фиктивный пароль и двигаться дальше, учетную запись не нужно защищать, ее единственная цель - это олицетворение, поэтому пароль «123» подойдет. Я просто удивлен, что вы можете иметь учетную запись пользователя без пароля, но не можете отправить сюда пустой пароль. - person kmfk; 31.08.2010
comment
Я попробовал ваше последнее редактирование и получил ту же ошибку. На данный момент я предполагаю, что вам НЕОБХОДИМО указать пароль. - person kmfk; 31.08.2010
comment
Это воняет :( Извините, я не смог придумать ответ! - person James King; 31.08.2010

Для этого вам нужно отключить политику безопасности

  1. Перейдите в Панель управления → Администрирование → Локальная политика безопасности.
  2. Просмотрите Параметры безопасности → Локальные политики → Параметры безопасности... Найдите учетные записи: Ограничьте использование локальной учетной записи пустым паролем только для входа в консоль.
  3. Выберите «Отключено» и ПРИМЕНИТЕ

здесь есть другое решение: https://sites.google.com/site/sqlestream/windows-issue/10-cannot-access-the-shared-folder-due-to-blank-password-not-разрешено

ProcessStartInfo procStartInfo = new ProcessStartInfo("File Name", "Argument(Optional)")
{
      UserName = "UserName",
      RedirectStandardError = true,
      RedirectStandardOutput = true,
      UseShellExecute = false,
      CreateNoWindow = true
};
using (Process proc = new Process())
{
       proc.StartInfo = procStartInfo;
       proc.Start();
}

и тогда вы сможете выполнить процесс без объявления пароля пользователя

person Tiago Gomes    schedule 16.08.2020

Как это указывает вопрос, установите LoadUserProfile в значение true в StartInfo. Попробуйте это, это может помочь.

person Community    schedule 30.08.2010
comment
Да, просмотрел другой пост - исполняемый файл, который я запускаю, тоже мой - не зависит от профилей пользователей. Спасибо хоть. - person kmfk; 31.08.2010

По-видимому, это известная проблема, связанная с тем, что LogonUser() не работает с пустым паролем. Я установил общий пароль для необходимых учетных записей пользователей в моем случае использования.

person kmfk    schedule 16.10.2012
comment
Скорее всего, это связано с установленным по умолчанию ограничением безопасности на использование пустого пароля: Учетные записи: Ограничьте использование пустых паролей локальной учетной записью только для входа в консоль. Если вы проверите код ошибки, это должно означать что-то вроде отказа в входе в систему из-за политики безопасности. - person ivan_pozdeev; 26.01.2016