Windows应用程序C++设置注册表信息存储读取及自启动

xingyun86 2021-3-24 930

Windows应用程序C++设置注册表信息存储读取

// 开启或关闭【更新或重启后,使用我的登录信息自动完成设备设置】
__inline static
BOOL SetCurrentUseARSOOptOut(bool bEnabled)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	WCHAR wzValueData[512] = { 0 };
	WCHAR wzUseARSOOptOutPath[512] = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\UserARSO\\";
	WCHAR userName[512] = L"";
	WCHAR sid[512] = L"";
	WCHAR userSID[512] = L"";
	int subAuthorities = 0;
	WCHAR userDomain[512] = L"";
	SID_NAME_USE snu = SidTypeUser;
	PSID_IDENTIFIER_AUTHORITY psia = NULL;
	DWORD nameSize = sizeof(userName) / sizeof(*userName);
	DWORD sidSize = sizeof(userSID) / sizeof(*userSID);
	DWORD domainSize = sizeof(userDomain) / sizeof(*userDomain);
	::GetUserNameW((LPWSTR)userName, &nameSize);
	::LookupAccountNameW(NULL, (LPWSTR)userName, (PSID)userSID, &sidSize, (LPWSTR)userDomain, &domainSize, &snu);
	psia = ::GetSidIdentifierAuthority(userSID);
	sidSize = _swprintf(sid, L"S-%lu-", SID_REVISION);
	sidSize += _swprintf(sid + wcslen(sid), L"%-lu", psia->Value[5]);
	subAuthorities = (*(int*)::GetSidSubAuthorityCount(userSID));
	for (int i = 0; i < subAuthorities; i++)
	{
		sidSize += _swprintf(sid + sidSize, L"-%lu", *GetSidSubAuthority(userSID, i));
	}
	lstrcatW(wzUseARSOOptOutPath, sid);
	printf("%ws\r\n", wzUseARSOOptOutPath);	
	if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, wzUseARSOOptOutPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hOpenKey, NULL) == ERROR_SUCCESS)
	{
		DWORD dwValue = (bEnabled == true) ? 0L : 1L;
		::RegSetValueExW(hOpenKey, L"OptOut", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(dwValue));
		::RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
// 获取当前登录用户的SID
__inline static
std::wstring GetSid()
{
	WCHAR userName[4096] = L"";
	WCHAR sid[4096] = L"";
	WCHAR userSID[4096] = L"";
	int subAuthorities = 0;
	WCHAR userDomain[4096] = L"";
	SID_NAME_USE snu = SidTypeUser;
	PSID_IDENTIFIER_AUTHORITY psia = NULL;
	DWORD nameSize = sizeof(userName) / sizeof(*userName);
	DWORD sidSize = sizeof(userSID) / sizeof(*userSID);
	DWORD domainSize = sizeof(userDomain) / sizeof(*userDomain);
	::GetUserNameW((LPWSTR)userName, &nameSize);
	::LookupAccountNameW(NULL, (LPWSTR)userName, (PSID)userSID, &sidSize, (LPWSTR)userDomain, &domainSize, &snu);
	psia = ::GetSidIdentifierAuthority(userSID);
	sidSize = _swprintf(sid, L"S-%lu-", SID_REVISION);
	sidSize += _swprintf(sid + wcslen(sid), L"%-lu", psia->Value[5]);
	subAuthorities = (*(int*)::GetSidSubAuthorityCount(userSID));
	for (int i = 0; i < subAuthorities; i++)
	{
		sidSize += _swprintf(sid + sidSize, L"-%lu", *GetSidSubAuthority(userSID, i));
	}
	printf("%ws\r\n", sid);
	return sid;
}
// 程序开机自动启动
__inline static
BOOL SetCurrentUserAutoBootWithRegistry(LPCSTR lpName, LPCSTR lpParamLine = NULL)
{
    BOOL bRet = FALSE;
    HKEY hOpenKey = NULL;
    CHAR szValueData[MAX_SYM_NAME] = { 0 };
    CHAR szModuleFileName[MAX_PATH] = { 0 };
    LPCSTR szAutoBootPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    if (RegOpenKey(HKEY_CURRENT_USER, szAutoBootPath, &hOpenKey) == ERROR_SUCCESS)
    {
        GetModuleFileName(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
        wsprintfA(szValueData, ("\"%s\"%s"), szModuleFileName, (!lpParamLine) ? "" : lpParamLine);
        RegSetValueExA(hOpenKey, lpValueName, 0, REG_SZ, (LPBYTE)szValueData, (lstrlenA(szValueData) + 1) * sizeof(CHAR));
        RegCloseKey(hOpenKey);
        bRet = TRUE;
    }
    return bRet;
}
__inline static
BOOL SetCurrentUserAutoBootWithRegistry(LPCWSTR lpName, LPCWSTR lpParamLine = NULL)
{
    BOOL bRet = FALSE;
    HKEY hOpenKey = NULL;
    WCHAR szValueData[MAX_SYM_NAME] = { 0 };
    WCHAR szModuleFileName[MAX_PATH] = { 0 };
    LPCWSTR szAutoBootPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    if (RegOpenKeyW(HKEY_CURRENT_USER, szAutoBootPath, &hOpenKey) == ERROR_SUCCESS)
    {
        GetModuleFileNameW(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
        wsprintfW(szValueData, (L"\"%s\"%s"), szModuleFileName, (!lpParamLine) ? L"" : lpParamLine);
        RegSetValueExW(hOpenKey, lpValueName, 0, REG_SZ, (LPBYTE)szValueData, (lstrlenW(szValueData) + 1) * sizeof(WCHAR));
        RegCloseKey(hOpenKey);
        bRet = TRUE;
    }
    return bRet;
}
__inline static
BOOL SetAutoBootWithRegistry(LPCSTR lpValueName, LPCSTR lpParamLine = NULL)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	CHAR szValueData[MAX_SYM_NAME] = { 0 };
	CHAR szModuleFileName[MAX_PATH + MAX_PATH] = { 0 };
	LPCSTR szAutoBootPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
	if (RegOpenKeyA(HKEY_LOCAL_MACHINE, szAutoBootPath, &hOpenKey) == ERROR_SUCCESS)
	{
		GetModuleFileNameA(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
		wsprintfA(szValueData, ("\"%s\"%s"), szModuleFileName, (!lpParamLine) ? "" : lpParamLine);
		RegSetValueExA(hOpenKey, lpValueName, 0, REG_SZ, (LPBYTE)szValueData, (lstrlenA(szValueData) + 1) * sizeof(CHAR));
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL SetAutoBootWithRegistry(LPCWSTR lpValueName, LPCWSTR lpParamLine = NULL)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	CHAR szValueData[MAX_SYM_NAME] = { 0 };
	WCHAR szModuleFileName[MAX_PATH] = { 0 };
	LPCWSTR szAutoBootPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
	if (RegOpenKeyW(HKEY_LOCAL_MACHINE, szAutoBootPath, &hOpenKey) == ERROR_SUCCESS)
	{
		GetModuleFileNameW(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
		wsprintfW(szValueData, (L"%s%s"), szModuleFileName, (!lpParamLine) ? L"" : lpParamLine);
		RegSetValueExW(hOpenKey, lpValueName, 0, REG_SZ, (LPBYTE)szValueData, (lstrlenW(szValueData) + 1) * sizeof(WCHAR));
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL SetAutoBootWithTask(LPCSTR lpTaskName, LPCSTR lpParamLine = NULL)
{
	CHAR szModuleFileName[MAX_PATH] = { 0 };
	CHAR szAutoRunCmd[MAX_PATH + MAX_PATH + MAX_PATH + MAX_PATH] = { 0 };
	GetModuleFileNameA(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
	if (lpParamLine != NULL)
	{
		wsprintfA(szModuleFileName, ("%s %s"), szModuleFileName, (!lpParamLine) ? "" : lpParamLine);
	}
	wsprintfA(szAutoRunCmd, ("schtasks /create /tn \"%s\" /tr %s /sc onstart /rl highest /f"), lpTaskName, szModuleFileName);
	return ExecuteCommand(szAutoRunCmd);
}
__inline static
BOOL SetAutoBootWithTask(LPCWSTR lpTaskName, LPCWSTR lpParamLine = NULL)
{
	WCHAR szModuleFileName[MAX_PATH] = { 0 };
	WCHAR szAutoRunCmd[MAX_PATH + MAX_PATH + MAX_PATH + MAX_PATH] = { 0 };
	GetModuleFileNameW(NULL, szModuleFileName, sizeof(szModuleFileName) / sizeof(*szModuleFileName));
	if (lpParamLine != NULL)
	{
		wsprintfW(szModuleFileName, (L"%s %s"), szModuleFileName, (!lpParamLine) ? L"" : lpParamLine);
	}
	wsprintfW(szAutoRunCmd, (L"schtasks /create /tn \"%s\" /tr %s /sc onstart /rl highest /f"), lpTaskName, szModuleFileName);
	return ExecuteCommand(szAutoRunCmd);
}
// 配置应用程序参数设置
__inline static
BOOL SetAppSettingWithRegistry(LPCSTR lpAppName, LPCSTR lpKey, LPCSTR lpValue)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	CHAR szSubKey[MAX_PATH + MAX_PATH] = { 0 };
	wsprintfA(szSubKey, "SOFTWARE\\%s", lpAppName);
	if (RegOpenKeyA(HKEY_CURRENT_USER, szSubKey, &hOpenKey) == ERROR_SUCCESS
		|| RegCreateKeyA(HKEY_CURRENT_USER, szSubKey, &hOpenKey))
	{
		RegSetValueExA(hOpenKey, lpKey, 0, REG_SZ, (LPBYTE)lpValue, (lstrlenA(lpValue) + 1) * sizeof(CHAR));
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL SetAppSettingWithRegistry(LPCWSTR lpAppName, LPCWSTR lpKey, LPCWSTR lpValue)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	WCHAR szSubKey[MAX_PATH + MAX_PATH] = { 0 };
	wsprintfW(szSubKey, L"SOFTWARE\\%s", lpAppName);
	if (RegOpenKeyW(HKEY_CURRENT_USER, szSubKey, &hOpenKey) == ERROR_SUCCESS
		|| RegCreateKeyW(HKEY_CURRENT_USER, szSubKey, &hOpenKey))
	{
		RegSetValueExW(hOpenKey, lpKey, 0, REG_SZ, (LPBYTE)lpValue, (lstrlenW(lpValue) + 1) * sizeof(WCHAR));
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL GetAppSettingWithRegistry(CHAR(&tValue)[MAX_PATH], const LPCSTR lpAppName, LPCSTR lpKey)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	DWORD dwValueSize = MAX_PATH;
	CHAR szSubKey[MAX_PATH] = { 0 };
	wsprintfA(szSubKey, "SOFTWARE\\%s", lpAppName);
	if (RegOpenKeyA(HKEY_CURRENT_USER, szSubKey, &hOpenKey) == ERROR_SUCCESS
		|| RegCreateKeyA(HKEY_CURRENT_USER, szSubKey, &hOpenKey))
	{
		RegQueryValueExA(hOpenKey, lpKey, NULL, NULL, (LPBYTE)tValue, &dwValueSize);
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL GetAppSettingWithRegistry(WCHAR(&tValue)[MAX_PATH], LPCWSTR lpAppName, LPCWSTR lpKey)
{
	BOOL bRet = FALSE;
	HKEY hOpenKey = NULL;
	DWORD dwValueSize = MAX_PATH;
	WCHAR szSubKey[MAX_PATH] = { 0 };
	wsprintfW(szSubKey, L"SOFTWARE\\%s", lpAppName);
	if (RegOpenKeyW(HKEY_CURRENT_USER, szSubKey, &hOpenKey) == ERROR_SUCCESS
		|| RegCreateKeyW(HKEY_CURRENT_USER, szSubKey, &hOpenKey))
	{
		RegQueryValueExW(hOpenKey, lpKey, NULL, NULL, (LPBYTE)tValue, &dwValueSize);
		RegCloseKey(hOpenKey);
		bRet = TRUE;
	}
	return bRet;
}
__inline static
BOOL GetRegistryString(WCHAR(&wValue)[MAX_PATH], LPCWSTR lpcwValueName, LPCWSTR lpcwSubKey, HKEY hKey = HKEY_CURRENT_USER)
{
    BOOL bRet = FALSE;
    HKEY hOpenKey = NULL;
    DWORD dwValueSize = MAX_PATH;
    if (::RegOpenKeyW(hKey, lpcwSubKey, &hOpenKey) == ERROR_SUCCESS
        || ::RegCreateKeyW(hKey, lpcwSubKey, &hOpenKey) == ERROR_SUCCESS)
    {
        ::RegQueryValueExW(hOpenKey, lpcwValueName, NULL, NULL, (LPBYTE)wValue, &dwValueSize);
        ::RegCloseKey(hOpenKey);
        bRet = TRUE;
    }
    return bRet;
}
__inline static
BOOL SetRegistryString(LPCWSTR lpcwValue, LPCWSTR lpcwValueName, LPCWSTR lpcwSubKey, HKEY hKey = HKEY_CURRENT_USER)
{
    BOOL bRet = FALSE;
    HKEY hOpenKey = NULL;
    if (::RegOpenKeyW(hKey, lpcwSubKey, &hOpenKey) == ERROR_SUCCESS
        || ::RegCreateKeyW(hKey, lpcwSubKey, &hOpenKey))
    {
        ::RegSetValueExW(hOpenKey, lpcwValueName, 0, REG_SZ, (LPBYTE)lpcwValue, (lstrlenW(lpcwValue) + 1) * sizeof(WCHAR));
        ::RegCloseKey(hOpenKey);
        bRet = TRUE;
    }
    return bRet;
}


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回