note : Change Environment by program
发布日期:2021-06-30 22:04:14 浏览次数:2 分类:技术文章

本文共 3137 字,大约阅读时间需要 10 分钟。

/// @file       ChangeEnvironment.cpp/// @brief      通过编程改变环境变量, 使新环境变量生效#include "stdafx.h"#include 
#include
#include
#define ENVIRONMENT_KEY \ L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"/// idea/// * change HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\/// Session Manager\Environment/// * SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, pEnv )/// e.g. create, modify Environment MSVC16_ROOT=C:\MSVC152/// @note /// test on win7x64sp1, compiler to x64 PEBOOL EnablePrivilege(BOOL bEnable);BOOL ChangeEnvironment(WCHAR * pcKey, WCHAR * pcValue);BOOL NotifyEnvironmentChange();int _tmain(int argc, _TCHAR* argv[]){ /// 提权 if (!EnablePrivilege(TRUE)) { _tprintf(L"EnablePrivilege FALSE \r\n"); } /// do task if (!ChangeEnvironment(L"MSVC16_ROOT", L"C:\\MSVC152")) { _tprintf(L"ChangeEnvironment FALSE\r\n"); goto _tmain_END; } /// 如果不通知系统(环境变量改变), 在cmd.exe中看set结果, 就不变 /// @note 需要查看系统变量的程序重启 /// e.g. /// * 当该程序运行完, 需要重新开一个cmd.exe , 执行 set MSVC16_ROOT, /// 看到环境变量变了 /// * 如果不执行 NotifyEnvironmentChange, 即使注册表中的环境变量值变了, /// 重新开一个cmd.exe, 看到的 MSVC16_ROOT 值还是旧的 if (!NotifyEnvironmentChange()) { _tprintf(L"NotifyEnvironmentChange FALSE\r\n"); }_tmain_END: _tprintf(L"END, press any key to quit\r\n"); getwchar(); return 0;}BOOL NotifyEnvironmentChange(){ LRESULT lRc = 0; lRc = ::SendMessage( HWND_BROADCAST, WM_WININICHANGE, (WPARAM)0, (LPARAM)L"Environment"); return (1 == lRc);}BOOL ChangeEnvironment(WCHAR * pcKey, WCHAR * pcValue){ BOOL bRc = FALSE; LONG lRc = 0; HKEY hkRc = NULL; DWORD dwLen = 0; lRc = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, ENVIRONMENT_KEY, 0, KEY_ALL_ACCESS, &hkRc); if (ERROR_SUCCESS != lRc) { goto _ChangeEnvironment_END; } dwLen = _tcslen(pcValue) * sizeof(WCHAR); ///< 字符串字节长度 lRc = ::RegSetValueEx( hkRc, pcKey, 0, REG_SZ, (const BYTE *)pcValue, dwLen); if (ERROR_SUCCESS != lRc) { goto _ChangeEnvironment_END; } bRc = TRUE;_ChangeEnvironment_END: if (NULL != hkRc) { ::RegCloseKey(hkRc); } return bRc;}BOOL EnablePrivilege(BOOL bEnable){ BOOL bRc = FALSE; HANDLE hToken = NULL; TOKEN_PRIVILEGES tkp; ::ZeroMemory(&tkp, sizeof(TOKEN_PRIVILEGES)); bRc = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (!bRc) return bRc; if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid)) goto _RaisePrivilege_END; tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_REMOVED; bRc = AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (!bRc) goto _RaisePrivilege_END; bRc = TRUE;_RaisePrivilege_END: if (NULL != hToken) CloseHandle(hToken); return bRc;}

转载地址:https://lostspeed.blog.csdn.net/article/details/14126653 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:vs2010 编译 TrueCrypt-7.1a-Source
下一篇:debug : 应用程序无法正常启动(0xc000007b)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月21日 13时34分14秒