Различия в доступе к ключу реестра между консолью и приложением с графическим интерфейсом - PullRequest
2 голосов
/ 06 июля 2010

У меня есть проект, который ссылается на другой проект, чтобы использовать некоторые части кода.Одним из проектов является консольное приложение (то есть тип проекта), но оно состоит из значительной базы кода.Другое приложение GUI, которое ссылается на это консольное приложение.Причина этого заключается в том, что приложение может быть запущено как консольное приложение или приложение с графическим интерфейсом.

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

Вот что не работает (изменения сделаны для скрытия определенных деталей):

String user = Environment.UserDomainName + "\\" + Environment.UserName;
RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule(user, RegistryRights.ReadKey | RegistryRights.Delete | RegistryRights.WriteKey | RegistryRights.FullControl, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow));
mapsynckey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\AppPath\\AppName\\");

UserName = mapsynckey.GetValue("user").ToString();
Password = mapsynckey.GetValue("pass").ToString();
SyncFolderPath = mapsynckey.GetValue("syncfolderpath").ToString();

Игнорировать права доступа, яПросто пробовал каждый из них, следовательно, случайную смесь.Я получаю следующее сообщение об ошибке:

Доступ к разделу реестра 'HKEY_LOCAL_MACHINE \ SOFTWARE \ AppPath \ AppName' запрещен

Вот другой вещь.Я не могу найти записи нигде в реестре, даже в 64-битном разделе.Тем не менее, я загружаю информацию о ключе реестра в приложение, которое отображается нормально, но если я просматриваю реестр, их там нет.

Я совершенно озадачен, я потратил последние 3 часаработая над этим, не зная, что происходит.


   at ApplicationSettings..ctor() in C:\Projects\MapSync\MapSyncConsole\ApplicationSettings.cs:line 34
   at ApplicationSettings.get_Instance() in C:\Projects\MapSync\MapSyncConsole\ApplicationSettings.cs:line 47
   at MainApplication..ctor(Boolean forceDownload) in C:\Projects\MapSync\MapSyncConsole\MainApplication.cs:line 27
   at MapSyncConsole.Program.Main(String[] args) in C:\Projects\MapSync\MapSyncConsole\Program.cs:line 21

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Прежде всего: проверяли ли вы (UAC) виртуализированные местоположения реестра? ( Смотри здесь ). Реестр использует механизм, аналогичный файловой системе для прозрачного перенаправления.

Дополнительно:

  • под каким токеном работает ваш процесс, повышен или нет? Предполагая, что у вас включено UAC: Запускаете ли вы консольное приложение из привилегированной строки (кажется, нет)? Я полагаю, вы запускаете версию пользовательского интерфейса двойным щелчком мыши?
  • менее вероятно: есть ли у одного из исполняемых файлов встроенный манифест, который управляет поведением повышения прав?
  • менее вероятно: процессы (консоль и пользовательский интерфейс) предназначены для разных архитектур процессоров?
0 голосов
/ 06 июля 2010

Вы не можете позвонить CreateSubKey в HKLM без прав администратора.

Вы должны рассмотреть возможность перехода на HKCU.

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