标题:
如何用VB编程修改注册表权限
[打印本页]
作者:
areyong
时间:
2006-4-1 18:38
标题:
如何用VB编程修改注册表权限
我想用VB编程来修改注册表某指定主键的权限(在WINXP/WIN2000/WIN2003)下。
比如说让
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
相对 EVERYONE 只有读取权
我在网上搜了好久,都没有找到相应的VB程序
只找到了一个C源码,但我对C不熟。不知道哪位高人能帮帮俺。。。
C源码见:
http://www.eviloctal.com/forum/htm_data/26/0502/8156.html
如果搜索“API实现了regedt32修改注册表权限”,可以搜出上文
另外,还有一个命令行下运行的工具setacl.exe,可以修改注册表的权限,
但我不想用它,我想用API来实现。
[
本帖最后由 areyong 于 2006-4-1 18:42 编辑
]
作者:
Nothing
时间:
2006-4-1 19:13
#include <Windows.h>
#include <Aclapi.h>
#pragma comment (lib,"Advapi32.lib")
void main()
{
DWORD dwRet;
LPSTR SamName = "MACHINE\\SAM\\SAM";
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pOldDacl = NULL;
PACL pNewDacl = NULL;
EXPLICIT_ACCESS ea;
HKEY hKey = NULL;
// 获取SAM主键的DACL
dwRet = GetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDacl, NULL, &pSD);
if (dwRet != ERROR_SUCCESS)
{
printf("GetNamedSecurityInfo Error: %d\n", dwRet);
goto FreeAndExit;
}
// 创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&ea, "Everyone", KEY_ALL_ACCESS, SET_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT);
// 将新的ACE加入DACL
dwRet = SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl);
if (dwRet != ERROR_SUCCESS)
{
printf("SetEntriesInAcl Error: %d\n", dwRet);
goto FreeAndExit;
}
// 更新SAM主键的DACL
dwRet = SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDacl, NULL);
if (dwRet != ERROR_SUCCESS)
{
printf("SetNamedSecurityInfo Error: %d\n", dwRet);
goto FreeAndExit;
}
// 打开SAM的子键
dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SAM\\SAM\\Domains\\Account\\Users\\000001F4",
0, KEY_ALL_ACCESS, &hKey);
if (dwRet != ERROR_SUCCESS)
{
printf("RegOpenKeyEx Error: %d\n", dwRet);
goto FreeAndExit;
}
printf("Open SAM Subkey Successfully.\n");
FreeAndExit:
if (hKey) RegCloseKey(hKey);
if (pNewDacl) LocalFree(pNewDacl);
// 还原SAM主键的DACL
if (pOldDacl) SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, pOldDacl, NULL);
if (pSD) LocalFree(pSD);
return;
}
先把代码贴过来,研究一下
欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/)
Powered by Discuz! 6.0.0