VC中如何以TrustedInstaller用户修改注册表

wstc53032979 2014-09-17 06:25:55
如何编程修改诸如 HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\NoAddOns\LegacyDisable 的键值?
用RegOpenKey会失败,原因是Administrator的权限,那个“完全控制”没有勾选上,直接勾无法勾上,需要在“高级”->“所有者”中选择“Administratosr” 为所有者(系统默认为TrustedInstaller),但是我想知道这个过程如何靠编程实现呢? 目前项目卡在这了,手动勾选的动作不可能让用户去做,必须靠编程自动化实现。
或者是不是可以换种思路,让生成的程序直接以TrustedInstaller用户来执行,请问这又如何做到呢?
有哪位大神知道解法吗? 回答的时候顺便留下QQ行吗? 或者加我QQ53032979 想详细咨询。
...全文
439 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurnero_vv 2014-11-24
  • 打赏
  • 举报
回复
剽窃我的代码也不注明一下 http://blog.csdn.net/yurnero123/article/details/41079707
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
现场剽窃是本贱人的绝技!
//如何以TrustedInstaller用户权限修改注册表
//通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
#pragma comment(lib,"advapi32")
#include <stdio.h>
#include <string.h>
#include <windows.h>
bool EnablePriviledge(LPCTSTR lpSystemName) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp = {1};
    if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) {
        if (LookupPrivilegeValue(NULL,lpSystemName,&tkp.Privileges[0].Luid)) {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
            if (GetLastError() != ERROR_SUCCESS) {
                CloseHandle(hToken);
                return false;
            }
        }
        CloseHandle(hToken);
    }
    return true;
}
int main() {
    bool bRet;
    LONG lResult;
    bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
    if (bRet) {
        bRet = EnablePriviledge(SE_RESTORE_NAME);
        if (bRet) {
            HKEY hResult = NULL;
            DWORD dwDisposition;
            lResult = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
                L"SOFTWARE\\Classes\\CLSID\\{871C5380-42A0-1069-A2EA-08002B30309D}\\shell\\NoAddOns",
                0,
                NULL,
                REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
                KEY_ALL_ACCESS,
                NULL,
                &hResult,
                &dwDisposition);
            if (lResult != ERROR_SUCCESS) {
                return 3;
            }
            wchar_t cValue[256] = L"";
            lResult = RegSetValueExW(hResult,L"LegacyDisable",NULL,REG_SZ,(LPBYTE)cValue,(wcslen(cValue)+1)*sizeof(wchar_t));
            if (lResult != ERROR_SUCCESS) {
                return 4;
            }
            RegCloseKey(hResult);
            printf("OK.\n");
            return 0;
        } else return 2;
    } else return 1;
}
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
向1楼学习,向1楼致敬!
yurnero_vv 2014-11-13
  • 打赏
  • 举报
回复
通过代码将当前权限提升到TrustedInstaller很麻烦,但是可以通过获取备份还原权限来绕过DACL的监测机制。
void main()
{
	bool bRet = true;
	bRet = EnablePriviledge(SE_BACKUP_NAME);//这个函数是重点,让当前进程具备备份/还原的特权。
	bRet = EnablePriviledge(SE_RESTORE_NAME);
	if(bRet)
	{
		HKEY hResult = NULL;
		DWORD dwDisposition;
		LONG lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT,
			L"CLSID\\{52205fd8-5dfb-447d-801a-d0b52f2e83e1}\\shell\\OpenNewWindow\\command",
			0,
			NULL,
			REG_OPTION_BACKUP_RESTORE,//这个是重点,传入这个参数可以直接忽视KEY_ALL_ACCESS这个参数的作用,直接以备份/还原的特权去操作注册表
			KEY_ALL_ACCESS,
			NULL,
			&hResult,
			&dwDisposition);
		if(lResult != ERROR_SUCCESS)
		{
			return;
		}	
		//下面是我随便写的,到了这一步如果都成功的话,下面的代码就可以为所欲为了。
		wchar_t cValue[256] = L"explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
		RegSetValueEx(hResult,L"xx",NULL,REG_SZ,(LPBYTE)cValue,sizeof(cValue));
		lResult = RegDeleteValue(hResult,L"xx");
		//lResult = RegDeleteValue(hResult,L"DelegateExecute");
		ErrMsg();
		RegCloseKey(hResult);

	}

}
bool EnablePriviledge(LPCTSTR lpSystemName)
{
	HANDLE hToken;
	TOKEN_PRIVILEGES tkp = {1};
	if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
	{
		if(LookupPrivilegeValue(NULL, lpSystemName,&tkp.Privileges[0].Luid))
		{
			tkp.PrivilegeCount = 1;
			tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
			AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); 
			if (GetLastError() != ERROR_SUCCESS)
			{
				CloseHandle(hToken);
				return false;
			}
		}
		CloseHandle(hToken);
	}
	return true;
}
打开链接下载源码: https://pan.quark.cn/s/d85aa9a28238 FreeRTOS,其全称为“Free Real-Time Operating System”,是一款具备开源特质且设计轻巧的实时操作系统(RTOS),主要应用于嵌入式系统领域。该“freertos工程文件以及官方文档.rar”压缩包内含了与FreeRTOS关联的工程文件、官方文档资料以及其他用于移植的文件,是进行FreeRTOS学习与应用的关键性资源。 FreeRTOS的核心特质涵盖任务调度机制、中断处理功能、同步机制设计以及内存管理策略。其中,任务调度机制是其核心功能,借助优先级抢占式调度算法,保障高优先级任务能够获得及时响应。中断处理功能是嵌入式系统中的关键环节,FreeRTOS支持在中断执行环境中开展特定操作,同时确保任务执行状态的安全。同步机制例如信号量、互斥量及事件标志组,主要用于实现任务之间的通信与协调。内存管理部分则负责动态分配和释放内存资源,以满足不同任务的特定需求。 工程文件通常由源代码、配置文件、编译脚本等构成,能够帮助开发者深入理解FreeRTOS的工作原理,并在此基础上进行定制化开发。例如,`FreeRTOSConfig.h`作为FreeRTOS的核心配置文件,允许用户依据目标硬件条件和应用需求调整内核参数,比如任务数量、堆大小等。 官方文档资料是学习FreeRTOS的重要参考资料,其内容详尽地阐述了系统架构、API函数、应用示例等关键信息。通过研读这些文档,开发者可以掌握如何创建任务、配置中断、实现任务间的同步与通信,以及如何对FreeRTOS系统进行调试和优化。 移植文件主要涉及将FreeRTOS部署于不同的微控制器(MCU)或硬件平台之上。每个平...

65,214

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧