我在注册表中有价值(Windows 7 x64):
[HKEY_CLASSES_ROOT\.html]
@="ChromeHTML"
然后我通过Delphi 7上的ServiceApplication阅读:
Reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_32KEY);
try
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('.html', False);
Default := Reg.ReadString('');
我的htmlfile
变量中有Default
。
我怎样才能获得正确的价值?
ps:destop应用程序中的相同代码读取正确的值。
答案 0 :(得分:3)
HKEY_LOCAL_MACHINE\Software\Classes
和HKEY_CURRENT_USER\Software\Classes
个键的{p> HKEY_CLASSES_ROOT
is a merged view,其中HKCU
中的值优先于HKLM
中的相应值。默认情况下,服务不会与桌面应用程序在同一用户帐户中运行。因此,对于服务实际运行的用户帐户,该用户的htmlfile
密钥中存在HKCU
,HKCU
中不存在值,但htmlfile
中确实存在HKLM
而是ImpersonateLoggedOnUser()
键。
为了使服务能够看到桌面应用程序看到的相同数据,该服务必须以同一用户身份访问注册表。你需要:
将SCM中的服务配置为以该用户帐户运行。
让服务使用HKEY_CLASSES_ROOT
或类似功能动态模拟用户帐户,然后正常打开该用户的LogonUser()
密钥。
让服务动态获取用户帐户的令牌,例如来自OpenProcessToken()
或HKEY_CLASSES_ROOT
,然后使用LoadUserProfile()
和RegOpenUserClassesRoot()
功能访问该用户的{{1}}密钥。