Windows自启动技术-注册表

Windows自启动技术-注册表

注册表自启动

Windows的Run和RunOnce注册表项可以让用户登陆系统时自动启动一些程序。

其中涉及到的注册表项如下:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

    在这四种项中添加的自启动程序的规则不一样:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run表示任何账户每一次登陆到Windows系统都会自动启动在这个项下面注册的程序

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce表示任何账户下一次登陆到Windows系统会自动启动在这个项下面注册的程序,以后就不会自启了

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run表示当前账户每一次登陆到Windows系统都会自动启动在这个项下面注册的程序

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce表示当前账户下一次登陆到Windows系统会自动启动在这个项下面注册的程序,以后就不会自启了
    一般来说
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run项下注册自启动项,不使用HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run注册表原因是因为修改该注册表的值需要管理员权限。

API 功能
RegCreateKey 创建一个KEY,并返回相应的HKEY
RegOpenKey 打开注册表,得到一个HKEY,用来作为下面这些函数的第一个参数
RegOpenKeyEx 同RegOpenKey类似,一般很少用,增加了一个访问控制类型参数
RegSetValue 设置一个HKEY的默认值
RegSetValueEx 设置一个HKEY除默认值以外其它的值
RegQueryValue 获取一个HKEY的默认值
RegQueryValueEx 获取一个HKEY除默认值以外其它的值
RegDeleteKey 删除一个KEY,此KEY不能包含子KEY
SHDeleteKey 删除一个KEY以及所有子KEY
RegDeleteValue 删除KEY里面的值
RegCloseKey 关闭注册表

编码实现

// auto_exection_reg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>


int main()
{
	HKEY   hKey;
	//const char *filename = "C:\\Users\\Public\\hello.exe";
	BYTE value[256] = "C:\\Users\\Public\\hello.exe";
	
	if (ERROR_SUCCESS != ::RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
	{
		MessageBox(0, "error", "error", MB_OK);
	}
	
	/*if (ERROR_SUCCESS != RegSetValueEx(hKey, L"hello", 0, REG_SZ, (const byte*)filename, (1 + ::strlen(filename))))
	{
		MessageBox(0, L"error", L"error", MB_OK);
	}*/
	if (ERROR_SUCCESS != RegSetValueEx(hKey, "hello", 0, REG_SZ, value, 256))
	{
		MessageBox(0, "error", "error", MB_OK);
	}

	RegCloseKey(hKey);
	MessageBox(0, "OK", "RegSetValueEx", MB_OK);
//	else
//	{
//		MessageBox(0, L"RegSetValueEx", L"error", MB_OK);
//	}
//
//
//}
//	else
//	{
//	MessageBox(0, L"error", L"error", MB_OK);
//	return false;
//	}

	
	system("pause");
	return 0;
}

//LSTATUS RegOpenKeyExA(
//	[in]           HKEY   hKey,
//	[in, optional] LPCSTR lpSubKey,
//	[in]           DWORD  ulOptions,
//	[in]           REGSAM samDesired,
//	[out]          PHKEY  phkResult
//);

重启系统

在实际中可能会遇到注册表重定向问题,HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run写入值后会发现值会被重定向到HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

在RegOpenKeyEx的时候可以将函数设置为KEY_WOW64_64KEY

LONG lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\***", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);

完整代码

#include "stdafx.h"
#include "AutoRun_Reg.h"


void ShowError(char *lpszText)
{
	char szErr[MAX_PATH] = { 0 };
	::wsprintf(szErr, "%s Error!\nError Code Is:%d\n", lpszText, ::GetLastError());
#ifdef _DEBUG
	::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}


BOOL Reg_CurrentUser(char *lpszFileName, char *lpszValueName)
{
	// 默认权限
	HKEY hKey;
	// 打开注册表键
	if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
	{
		ShowError("RegOpenKeyEx");
		return FALSE;
	}
	// 修改注册表值,实现开机自启
	if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
	{
		::RegCloseKey(hKey);
		ShowError("RegSetValueEx");
		return FALSE;
	}
	// 关闭注册表键
	::RegCloseKey(hKey);

	return TRUE;
}


BOOL Reg_LocalMachine(char *lpszFileName, char *lpszValueName)
{
	// 管理员权限
	HKEY hKey;
	// 打开注册表键
	if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
	{
		ShowError("RegOpenKeyEx");
		return FALSE;
	}
	// 修改注册表值,实现开机自启
	if (ERROR_SUCCESS != ::RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
	{
		::RegCloseKey(hKey);
		ShowError("RegSetValueEx");
		return FALSE;
	}
	// 关闭注册表键
	::RegCloseKey(hKey);

	return TRUE;
}
posted @ 2022-06-23 21:11  nice_0e3  阅读(1680)  评论(0编辑  收藏  举报