2010-08-30 4 views
0

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

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

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

ответ

0

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

+0

Скорее всего, это обусловлено стандартным ограничением безопасности при использовании пустого пароля: [Учетные записи: ограничение использования локальной учетной записи пустых паролей только для входа в консоль) (https://technet.microsoft.com/en-us/library/jj852174.aspx). вы проверяете код ошибки, это должно означать что-то вроде «logon denied из-за политики безопасности». –

1

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

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

* Редактировать *

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

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

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

+0

Если я либо не хочу указывать какой-либо пароль (опускаю 'StartInfo.Password'), то получаю то же сообщение. Если я войду в панель управления и изменим учетную запись пользователя и добавлю пароль (используя символ «А» для тестирования), я могу передать «А» в качестве пароля через SecureString, и это отлично работает. Просто не нужно было устанавливать пароль ... – kmfk

+0

Вы пытались вызвать перегруженный Start(), который принимает имя пользователя, pw и домен и передает туда пустой пароль? Я бы ожидал такого же результата, но не оставил камня на камне ... –

+0

Проблема в том, что StartInfo.Password является 'System.Security.SecureString', поэтому даже перегруженный' Start() 'требует' System.Security.SecureString ', а не только строку, которая не может быть пустой. Im очень близко к тому, чтобы просто установить фиктивный пароль и двигаться дальше, учетная запись не нуждается в защите, ее единственная цель заключается в этом олицетворении, поэтому пароль «123» в порядке. Я просто удивился, что вы можете иметь учетную запись пользователя без пароля, но здесь не можете отправить пустой пароль. – kmfk

0

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

+0

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