Странная проблема.Приложение, запущенное с Process.Start, выдает UnauthorizedAccessException при записи в реестр Windows. - PullRequest
0 голосов
/ 09 сентября 2011

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

Как защитить сетевую папку, содержащую базу данных Access, при этом позволяя приложению WinForms подключаться к базе данных

Вот код для приложения-оболочки:

string sysFolder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = (sysFolder + @"\AppMain.exe").Replace(@"file:\",  @"\\");
pInfo.UserName = GetUserName();
pInfo.Password = ToSecure(GetPassword());
pInfo.UseShellExecute = false;
Process p = Process.Start(pInfo);
p.WaitForExit();

Методы GetUserName () и GetPassword () просто извлекают имя пользователя и пароль из зашифрованного текстового файла. Метод ToSecure () просто преобразует String в System.Security.SecureString .

Ok. Теперь вот странная часть! :) Это приложение-обертка действительно работает правильно MOST времени; но по какой-то странной причине кажется, что проблема возникает сразу после перезагрузки системы. После перезапуска примерно на 5 минут запускаемое приложение (AppMain.exe) выдает исключение UnauthorizedAccessException, когда приложение пытается выполнить запись в реестр Windows. Я понятия не имею, почему это происходит не так в первые 5 минут, а потом вдруг начинает работать правильно.

Обратите внимание, что мне нужно закрыть приложение и перезапустить его через пять минут после загрузки, чтобы оно работало правильно. Если я просто нажимаю «продолжить» в ожидании, оно продолжает выдавать исключение при попытке записи в реестр.

Вот код, который выдает исключение при запуске приложения после перезагрузки.

Microsoft.VisualBasic.Interaction.SaveSetting("app", "settings", "time", DateTime.Now.ToString());

Я подтвердил такое поведение на XP и Windows 7. У любого есть идеи, почему это происходит при запуске и почему исключение внезапно исчезает, если я запускаю приложение через 5 минут после загрузки.

Ответы [ 3 ]

0 голосов
/ 09 сентября 2011

Per ProcessStartInfo.Password Свойство Раздел справки на http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password.aspx, Убедитесь, что вы указали значение свойства Domain.

0 голосов
/ 15 сентября 2011

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

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.loaduserprofile.aspx

ProcessStartInfo.LoadUserProfile был недостающим элементом головоломки.В объекте информации о процессе есть свойство LoadUserProfile , которое указывает, должен ли загружаться профиль пользователя, и значением по умолчанию для этого свойства является false .Но если вызываемому процессу требуется доступ к HKEY_CURRENT_USER, как пытался сделать мой вызываемый процесс, тогда это свойство должно быть установлено на true .

Так что, как только я установлю LoadUserProfile до true в pInfo тогда мое приложение работало на 100%, даже сразу после перезапуска.

0 голосов
/ 09 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...