2010-07-06 58 views
2

我有一个引用另一个项目的项目,以便利用代码的某些部分。其中一个项目是一个控制台应用程序(即项目类型),但由一个重要的代码库组成。另一个是引用此控制台应用程序的GUI应用程序。这样做的原因是,应用程序可以作为控制台应用程序或GUI应用程序运行。控制台和GUI应用程序之间的注册表项访问差异

当GUI应用程序运行时,它绝对可以访问注册表,但是当我运行控制台版本时,它访问与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 
+0

什么是堆栈跟踪? – SLaks 2010-07-06 13:44:22

+0

添加为您的乐趣。 – Kezzer 2010-07-06 13:47:32

+0

也许是因为控制台和表单版本的“AppPath”和“AppName”不同? – 2010-07-06 13:52:48

回答

0

不能调用CreateSubKey在HKLM没有管理员权限。

您应该考虑切换到HKCU。

+0

事实上,这也是我所设想的,但为什么GUI应用程序允许这个和控制台应用程序不是?他们从同一个用户运行。 – Kezzer 2010-07-06 13:46:55

+0

哦,还有,我是本地管理员,这让我更加困惑。 – Kezzer 2010-07-06 13:48:12

+0

是否启用UAC? – SLaks 2010-07-06 14:12:48

1

首先,您是否检查过(UAC)虚拟化注册表位置? (See here)。注册表使用与文件系统类似的机制进行透明重定向。

此外:

  • 该令牌的进程下运行,高架或没有?假设你已经启用了UAC:你是否从一个提升的提示符启动了控制台应用程序(似乎没有)?我猜你通过双击启动UI版本?
  • 可能性较低:其中一个可执行文件是否具有嵌入式清单,用于处理提升行为?
  • 可能性较低:进程(控制台与UI)是否针对不同的处理器体系结构?
相关问题