最近做一个注册表扫描的项目,遇到一些问题,现已解决,拿出来分享分享,大家见笑了!
编写一个MFC程序,用CRegKey生成的对象reg的Open()函数打开注册表居然只能用KEY_READ权限,用KEY_WRITE不能成功.只有HKEY_CURRENT_USER项的部分能用KEY_WRITE权限。以下是注册表遍历(编译环境UNICODE字符环境):
调用试例:
遍历HKEY_USERS项
EnumKKey(L"HKEY_USERS",HKEY_USERS,L"");
//递归函数
EnumKKey(const char *strAllPath, HKEY hkey, char *sKeyName)
{
CRegKey regParent;
if(ERROR_SUCCESS == regParent.Open(hkey,sKeyName,KEY_READ) )
{
TCHAR temp[1024];
DWORD dwIndex = 0;
DWORD dwSize = MAX_PATH;
TCHAR szExtension[MAX_PATH];
while(ERROR_NO_MORE_ITEMS != regParent.EnumKey(dwIndex,szExtension,&dwSize) )
{
dwIndex++;
dwSize = MAX_PATH;
wcscpy_s(temp,strAllPath);
wcscat(temp,L"//");
wcscat(temp,szExtension);
GetDlgItem(IDC_STATIC)->SetWindowTextW(temp);
EnumKKey(temp,regParent.m_hKey,szExtension);
}
}
regParent.Close();
}
当Open函数中权限值是KEY_READ时无任何问题,更改其它权限则打不开。经过测试,直接用API函数RegOpenEx()也无法在其他权限下打开。或许你会认识这是注册表项的权限问题,或者说这是因为有些注册表项是32-bit的,有些是64-bit的,用32-bit的App无法打开64-bit的注册表项。这或许是原因,但此处不是,此处的原因会给你一个surpising!
解决方法
在win7中,微软为提高系统安全引入UAC(User Account Control,用户帐户控制),你所编译的程序应以管理员的身份进行执行,右击你的可执行程序,以管理员身份运行即可。对于编写代码来说,这比叫麻烦。若你用的是Visual Studio 2010,则visual studio 应以管理员身份运行。一劳永逸的方法,右击visual studio 2010,属性,兼容性,以管理员身份执行(UAC控制配置)。意外吧!编程还得用管理员身份,想不到这还有影响。。。。
分享一个visual studio 2010的下载地址,有效期大致为今后7天内。