工控编程吧
标题:
381上位机VC MFC通过注册表禁用与使用注册表程序1
[打印本页]
作者:
qq263946146
时间:
2016-9-16 11:24
标题:
381上位机VC MFC通过注册表禁用与使用注册表程序1
(, 下载次数: 0)
上传
点击文件名下载附件
禁用与使用注册表程序
功能展示
注册表程序即regedit.exe是系统自带的存放在C:\\Windows目录下的程序,主要用来对注册表的手工修改,很多时候我们在工控机上并不想让用户手工胡乱修改影响系统的正常运行,那么我们就想通过代码禁止用户使用注册表程序,我们当前例程就实现了这一功能,效果如图。点击<禁止使用注册表程序>再次打开注册表时就会提示无法打开。点击<允许使用注册表程序>就可再次使用注册表程序
要点提示
例程主要是通过修改注册表指定键下的键值项来实现禁止注册表程序的。原理为在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System下创建一类型为DWORD的键值项,名称可随意,例程为DisableRegistryTools。,修改其值为0表示允许使用,改为1表示禁止使用注册表程序;
有时键System并不存在,所以我们例程使用了函数RegCreateKeyEx(),函数用于创建一子键,子键存在就打开子键,不存在就创建。注册表键不区分大小写。
函数原型
ONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,LPTSTR lpClass, DWORD dwOptions,REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);
hKey?:入参,一个打开键的句柄。调用该函数的进程必须拥有KEY_CREATE_SUB_KEY的权力。该句柄可以是RegCreateKeyEx或者RegOpenKeyEx的返回值,也可以是以下预定义的值?HKEY_CLASSES_ROOT ,HKEY_CURRENT_CONFIG,??HKEY_CURRENT_USER,?HKEY_LOCAL_MACHINE,?HKEY_USERS;
lpSubKey?:入参,标识子键名称。该参数不能为空。参数中不能存在(/);
Reserved?保留值,必须为0;
lpClass:入参,指向一个字符串,该字符串定义了该键的类型。可以为空。该参数可以在操作本地和远程注册表时使用;
dwOptions?:入参,该参数可以是以下值 ??REG_OPTION_BACKUP_RESTORE,0x00000004L? ??REG_OPTION_NON_VOLATILE,0x00000000L ,一般使用该值 ??REG_OPTION_VOLATILE,0x00000001L?;
samDesired?:入参,定义访问权限;
lpSecurityAttributes?:入参,定义返回的句柄是否可以被子进程继承,为NULL时不能继承; phkResult? 出参,保存返回的句柄;
lpdwDisposition?:出参,可以是以下值。如果为空,则不返回。
REG_CREATED_NEW_KEY,0x00000001L 该键是新创建的键.
REG_OPENED_EXISTING_KEY,0x00000002L
该键是已经存在的键; R
eturn Values成功则返回 ERROR_SUCCESS.; Remarks该函数创建的键没有键值。
应用程序不能创建HKEY_USERS 或者 HKEY_LOCAL_MACHINE的直接子键;
最后要注意的是程序对注册表目录的访问在WIN7系统中得获得管理员权限,具体可鼠标右键以管理员运行,也可加载例程根目录文件gkbc8_com.manifest到工程,类型为24 ,ID修改为1,重新编译,双击生成的程序运行就可;
实现功能
1.新建基于对话框的应用程序
2.添加按钮<禁止使用注册表程序><允许使用注册表程序>关联点击函数
void CGkbc8Dlg::OnAllow()
{
CString sDebugText;
DWORD dwData = 0;
HKEY key;
int nResult;
nResult = RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",0,
REG_NONE,REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &key, NULL);
if(nResult!=ERROR_SUCCESS)
{
sDebugText.Format("RegCreateKeyEx()错误代码:%d",nResult);
MessageBox(sDebugText);
if(!SetRegPrivilege("CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System") )
return;
}
if(RegSetValueEx(key,"DisableRegistryTools",0,REG_DWORD,(const unsigned char *)&dwData,4)!=ERROR_SUCCESS)//注意数据长度应该设为4
MessageBox("取消失败");
RegCloseKey(key);
MessageBox("取消成功");
}
void CGkbc8Dlg::OnForbid()
{
CString sDebugText;
DWORD dwData = 1;
HKEY key;
int nResult;
nResult = RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",0,
REG_NONE,REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &key, NULL);
if(nResult!=ERROR_SUCCESS)
{
sDebugText.Format("RegCreateKeyEx()错误代码:%d",nResult);
MessageBox(sDebugText);
if(!SetRegPrivilege("CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System") )
return;
}
if(RegSetValueEx(key,"DisableRegistryTools",0,REG_DWORD,(const unsigned char *)&dwData,4)!=ERROR_SUCCESS)//注意数据长度应该设为4
MessageBox("禁止失败");
RegCloseKey(key);
MessageBox("禁止成功");
}
其中函数SetRegPrivilege()为自定义的获取权限的函数,函数可屏蔽不使用;
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/18bfa3dffc832273cf53f2116652aa40/0/0/w_19rswmy54d.swf-albumId=6292849409-tvId=6292849409-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4