现在发现,网上关于这方面的代码很是不多,笔者也是苦苦寻找了好久好久才从大神那里得到些许,然后根据自己的理解,修改了,才运行成功的。闲话少叙,直接说吧,我们知道本地组策略,实质上就是修改注册表,有人就会说,那我直接修改注册表好了,干嘛费这么大的劲去修改本地组策略呢,可是有个问题就是本地组策略表示设置每次在刷新设置的时候都是变化的,也就是说,即使你修改了注册表,但是也是有缓存的,并不能立即生效,
这是我电脑里面的关于组策略的注册表项,但是,你知道那个是有效地,那个是过期的吗?
所以我们就需要用到了IGroupPolicyObject
#include"stdafx.h"
#define INITGUID
#include<iostream>
#include<Windows.h>
#include<GPEdit.h>
#include<Guiddef.h>
using namespace std;
//本地组策略是否禁用任务管理器
LRESULT DisableTaskMgr(int mark)
{
::CoInitialize(NULL);
LRESULT status;
LRESULT hr=S_OK;
IGroupPolicyObject*pGPO=NULL;
hr=CoCreateInstance(CLSID_GroupPolicyObject,NULL,CLSCTX_INPROC_SERVER,IID_IGroupPolicyObject,(LPVOID*)&pGPO);
if(hr==S_OK)
{
cout<<"GPO创建成功\n";
}
else
{
cout<<"GPO创建失败\n";
return E_FAIL;
}
DWORD dwSection=GPO_SECTION_USER;
HKEY hGPOKey=0;
hr=pGPO->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY);
if(SUCCEEDED(hr))
{
cout<<"打开本地机器成功\n";
}
else
{
cout<<"打开本地失败\n";
return E_FAIL;
}
hr=pGPO->GetRegistryKey(dwSection,&hGPOKey);
if(SUCCEEDED(hr))
{
cout<<"加载注册表成功\n";
}
else
{
cout<<"加载注册表失败\n";
return E_FAIL;
}
//禁用任务管理器
HKEY hKey=NULL;
if(mark==1)
{
status=RegOpenKeyEx(hGPOKey,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",0,
KEY_WRITE,&hKey);
if(status!=ERROR_SUCCESS)
{
status=RegCreateKeyEx(hGPOKey,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",0,
NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,NULL);
if(status==S_OK)
{
cout<<"创建键值成功\n";
}
else
{
cout<<"创建键值失败\n";
return E_FAIL;
}
}
DWORD lpData=1;
status=RegSetKeyValue(hKey,NULL,"DisableTaskMgr",REG_DWORD,(LPCVOID)&lpData,4);
status = RegCloseKey(hKey);
}
GUID Registerid=REGISTRY_EXTENSION_GUID;
GUID ThisGuid={
0x0F6B957E,
0x509E,
0x11D1,
{0xA7, 0xCC, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3}
};
RegCloseKey(hGPOKey);
status=pGPO->Save(FALSE,TRUE,&Registerid,&ThisGuid);
pGPO->Release();
::CoUninitialize();
}
int main()
{
DisableTaskMgr(1);
}
这样的功能就是禁用了任务管理器