工控编程吧
标题:
382上位机VC MFC通过注册表限制指定程序运行
[打印本页]
作者:
qq263946146
时间:
2016-9-16 11:22
标题:
382上位机VC MFC通过注册表限制指定程序运行
(, 下载次数: 1)
上传
点击文件名下载附件
限制指定程序运行
功能展示
设备的工控机上当然是能少运行程序就少运行,一般只运行我们的上位机就可,如果运行了其他的软件如果病毒或游戏,难免会对电脑造成影响,那么我们就想限制运行的软件。我们当前例程就通过注册表实现指定程序的运行,其他程序无法运行,效果如图。<添加程序><删除程序>可以设置列表框内的程序名称,<允许列表中程序运行><取消限制>可以限制系统运行的程序,及取消这一限制
要点提示
限制系统运行程序功能的实现主要的思路是:
1、在注册表键下HKEY_CURRENT_USER\Software\ Microsoft\Windows\CurrentVersion\Policies\Explorer,创建一键值项,项的名称可任意例程为AllowRun,项的类型为REG_DWORD,值为1;
2.再创建一个子键HKEY_CURRENT_USER\Software\ Microsoft\Windows\CurrentVersion\Policies\Explorer\ AllowRun, AllowRun为先前创建的键值项名称;
3.这样在键AllowRun下面就可创建多个类型为REG_SZ键值项进行仅能在系统上运行的程序的设置。键值项的名称任意,键值项的值就为程序的名称如regedit.exe,gkbc8.exe,notepad.exe;
4.取消取消限制只要删除键项AllowRun,或修改其值为0;
注册表修改仅在重启系统生效;
另外在注意的是在学习例程时建议包含注册表程序regedit.exe 及例程程序,不然可能误操作全部程序都无法在系统上运行。出现这种情况可以通过重启电脑,按F8等键以<带命令的安全模式>进入系统手动设置加注册表的参数
实现功能
1.新建基于对话框的应用程序
2.添加列表控件关联变量CListCtrl m_List;添加编辑框IDC_EDIT1用于程序名称的输入。添加按钮控件<添加程序><删除程序><仅允许列表中程序运行><取消限制>关联按钮的点击函数
void CGkbc8Dlg::OnDelete()
{
CString sEXEName;
GetDlgItemText(IDC_EDIT1,sEXEName);
AddDeleteEXE(sEXEName,FALSE);
}
void CGkbc8Dlg::OnAdd()
{
CString sEXEName;
GetDlgItemText(IDC_EDIT1,sEXEName);
AddDeleteEXE(sEXEName);
}
void CGkbc8Dlg::OnAllow() //仅运行列表框程序运行
{
DWORD dwData = 1;
HKEY key;
int nResult;
nResult = RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",0,KEY_ALL_ACCESS,&key);
if(nResult!=ERROR_SUCCESS)
{
if(!SetRegPrivilege("CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer") )
return;
}
if(RegSetValueEx(key,"AllowRun",0,REG_DWORD,(const unsigned char *)&dwData,4)!=ERROR_SUCCESS)//注意数据长度应该设为4
{
RegCloseKey(key);
return;
}
//<>
DWORD dwSize = _MAX_PATH+1;
RegCreateKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\AllowRun",&key);
CString sIndex,sEXEName;
for(int i=0;i<m_List.GetItemCount();i++)
{
sIndex = m_List.GetItemText(i,0);
sEXEName = m_List.GetItemText(i,1);
nResult = RegSetValueEx(key,sIndex.GetBuffer(0),0,REG_SZ,(const unsigned char *)sEXEName.GetBuffer(0),dwSize);
}
RegCloseKey(key);
if(nResult ==ERROR_SUCCESS)
MessageBox("设置成功!");
}
void CGkbc8Dlg::OnDisallow()
{
DWORD dwData = 0;
HKEY key;
int nResult;
nResult = RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",0,KEY_ALL_ACCESS,&key);
if(nResult!=ERROR_SUCCESS)
{
if(!SetRegPrivilege("CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer") )
return;
}
RegSetValueEx(key,"AllowRun",0,REG_DWORD,(const unsigned char *)&dwData,4);//注意数据长度应该设为4
//<>
nResult=RegDeleteKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\AllowRun");
if(ERROR_SUCCESS==nResult)
AfxMessageBox("取消成功!");
}
3.按钮点击函数中调用有我们自己编写的函数
BOOL SetRegPrivilege(CString sSAMPath);//提升修改权限
BOOL SetRegValue(HKEY hRootKey,CString sSubKey,CString sValueName,DWORD dwData);//设置值
void AddDeleteEXE(CString sEXEName,BOOL bOption = TRUE);//程序如gkbc8.exe,默认添加
自定义的函数体过长就粘贴出来,可以打开例程工程复制使用,最后就是程序初始化时初始化控件,向列表控件添加一些软件 名称。
m_List.ModifyStyle(0,LVS_REPORT,NULL);
m_List.InsertColumn(0,"索引",LVCFMT_LEFT,90);
m_List.InsertColumn(1,"程序名称",LVCFMT_LEFT,300);
AddDeleteEXE("gkbc8.exe");
AddDeleteEXE("regedit.exe");
在对例程中注册表位置的键的操作,程序还得获得有管理员的操作权限,可以鼠标右键例程以管理员身份运行,也可通过代码实现:载入例程根目录文件gkbc8_com.manifest到工程,类型填写24,ID设置为1,全部编译下,就可直接双击打开例程,实现通过注册表限制程序运行功能;
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/76e66687e91719454a4a68e87577b5d5/0/0/w_19rswnknnl.swf-albumId=6291803309-tvId=6291803309-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4