• 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;
    }
    
  • 相关阅读:
    [ASP.NET]ScriptManager控件使用
    [ASP.NET]使用uploadify上传图片,并在uploadify按钮上生成预览图
    [Javascript]js判断是否为undefined类型
    [Bug]转:使用jquery的 uploadify,在谷歌浏览器上总会崩溃的解决方法
    [NHibernate]Nhibernate如何映射sqlserver中image字段
    远程访问CENTOS的MYSQL数据库设置
    DELPHI的一些开源项目GIT地址
    unigui导出EXCEL使用NATIVEEXCEL
    IdHTTPServer(indy10)开发REST中间件
    centos7安装MYSQL
  • 原文地址:https://www.cnblogs.com/nice0e3/p/16406768.html
Copyright © 2020-2023  润新知