func:添加win是否已管理员形式运行函数。
This commit is contained in:
parent
b8ec3c55cb
commit
da08449531
9
.vscode/settings.json
vendored
9
.vscode/settings.json
vendored
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"files.autoSave": "onFocusChange",
|
"files.autoSave": "onFocusChange",
|
||||||
"editor.fontSize": 14,
|
"editor.fontSize": 14,
|
||||||
"editor.fontFamily": "'ComicShannsMono Nerd Font', 'ComicShannsMono Nerd Font', 'ComicShannsMono Nerd Font'",
|
"editor.fontFamily": "'Source Code Pro', 'Courier New', monospace",
|
||||||
"cmake.configureOnOpen": true,
|
"cmake.configureOnOpen": true,
|
||||||
"cmake.debugConfig": {
|
"cmake.debugConfig": {
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
@ -20,7 +20,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"cmake.configureSettings": {
|
"cmake.configureSettings": {
|
||||||
"CMAKE_TOOLCHAIN_FILE": "${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
"CMAKE_TOOLCHAIN_FILE": "${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
|
||||||
|
"USE_TEST": "ON"
|
||||||
},
|
},
|
||||||
"cmake.options.statusBarVisibility": "visible",
|
"cmake.options.statusBarVisibility": "visible",
|
||||||
"cmake.generator": "Ninja",
|
"cmake.generator": "Ninja",
|
||||||
@ -82,6 +83,8 @@
|
|||||||
"xmemory0": "cpp",
|
"xmemory0": "cpp",
|
||||||
"xstddef": "cpp",
|
"xstddef": "cpp",
|
||||||
"xtr1common": "cpp",
|
"xtr1common": "cpp",
|
||||||
"xutility": "cpp"
|
"xutility": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"xhash": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -8,17 +8,26 @@ if (MSVC)
|
|||||||
add_compile_options(/source-charset:utf-8)
|
add_compile_options(/source-charset:utf-8)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE "Release")
|
||||||
|
endif()
|
||||||
|
|
||||||
message(STATUS "System: ${CMAKE_SYSTEM_NAME}")
|
message(STATUS "System: ${CMAKE_SYSTEM_NAME}")
|
||||||
message(STATUS "Compiler CXX ID: ${CMAKE_CXX_COMPILER_ID}")
|
message(STATUS "Compiler CXX ID: ${CMAKE_CXX_COMPILER_ID}")
|
||||||
|
|
||||||
# find_package(GTest CONFIG REQUIRED)
|
|
||||||
|
|
||||||
set(SRC_FILES
|
set(SRC_FILES
|
||||||
src/of_path.cpp src/of_str.cpp
|
src/of_path.cpp src/of_str.cpp
|
||||||
|
src/of_win.cpp
|
||||||
)
|
)
|
||||||
include_directories(include)
|
|
||||||
|
|
||||||
add_subdirectory(test)
|
include_directories(include)
|
||||||
|
if(DEFINED USE_TEST)
|
||||||
|
message(STATUS "USE TEST")
|
||||||
|
add_subdirectory(test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
|
||||||
|
|
||||||
add_library(Ofen STATIC ${SRC_FILES})
|
add_library(Ofen STATIC ${SRC_FILES})
|
||||||
target_include_directories(Ofen PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
target_include_directories(Ofen PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
@ -11,4 +11,12 @@ using ofString = std::string;
|
|||||||
#define ofT(text) text
|
#define ofT(text) text
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum OfStatus {
|
||||||
|
STA_SUCESS = 0,
|
||||||
|
STA_ERROR,
|
||||||
|
STA_CANOT_OPEN_REG,
|
||||||
|
STA_CANOT_QUERY_REG,
|
||||||
|
STA_CANOT_SET_REG
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
22
include/of_win.h
Normal file
22
include/of_win.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include "of_def.hpp"
|
||||||
|
|
||||||
|
class COfWin {
|
||||||
|
public:
|
||||||
|
COfWin();
|
||||||
|
~COfWin();
|
||||||
|
public:
|
||||||
|
/// @brief 获取机器上安装的VS安装目录
|
||||||
|
/// @return
|
||||||
|
static OfStatus getVSInstallations(std::map<ofString, ofString>& out);
|
||||||
|
static OfStatus appendPathVariable(const ofString& path);
|
||||||
|
static OfStatus removePathVariable(const ofString& path);
|
||||||
|
static bool isAdminRun(bool& is_admin);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
71
src/of_win.cpp
Normal file
71
src/of_win.cpp
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#include "of_win.h"
|
||||||
|
|
||||||
|
constexpr auto g_VSReg = ofT("");
|
||||||
|
constexpr auto g_EnvReg = ofT("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
|
||||||
|
|
||||||
|
COfWin::COfWin()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
COfWin::~COfWin()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
OfStatus COfWin::getVSInstallations(std::map<ofString, ofString>& out)
|
||||||
|
{
|
||||||
|
return STA_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
OfStatus COfWin::appendPathVariable(const ofString& path)
|
||||||
|
{
|
||||||
|
HKEY hKey;
|
||||||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_EnvReg, 0, KEY_READ | KEY_WRITE, &hKey) != ERROR_SUCCESS) {
|
||||||
|
return STA_CANOT_OPEN_REG;
|
||||||
|
}
|
||||||
|
DWORD bufferSize = 0;
|
||||||
|
if (RegQueryValueEx(hKey, "Path", nullptr, nullptr, nullptr, &bufferSize) != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return STA_CANOT_QUERY_REG;
|
||||||
|
}
|
||||||
|
ofString currentPath(bufferSize, ofT('\0'));
|
||||||
|
if (RegQueryValueEx(hKey, "Path", nullptr, nullptr, reinterpret_cast<LPBYTE>(¤tPath[0]), &bufferSize) != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return STA_CANOT_QUERY_REG;
|
||||||
|
}
|
||||||
|
currentPath.resize(bufferSize - 1);
|
||||||
|
ofString updatedPath = currentPath + ofT(";") + path;
|
||||||
|
if (RegSetValueEx(hKey, "Path", 0, REG_EXPAND_SZ, reinterpret_cast<const BYTE*>(updatedPath.c_str()), updatedPath.size() + 1) != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return STA_CANOT_SET_REG;
|
||||||
|
}
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, reinterpret_cast<LPARAM>("Environment"), SMTO_ABORTIFHUNG, 5000, nullptr);
|
||||||
|
return STA_SUCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
OfStatus COfWin::removePathVariable(const ofString& path)
|
||||||
|
{
|
||||||
|
return STA_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool COfWin::isAdminRun(bool& is_admin)
|
||||||
|
{
|
||||||
|
BOOL isAdmin = FALSE;
|
||||||
|
HANDLE tokenHandle = nullptr;
|
||||||
|
|
||||||
|
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &tokenHandle)) {
|
||||||
|
// 获取管理员组的 SID
|
||||||
|
SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
|
||||||
|
PSID adminGroup;
|
||||||
|
if (AllocateAndInitializeSid(&ntAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
|
||||||
|
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &adminGroup)) {
|
||||||
|
// 检查当前令牌是否属于管理员组
|
||||||
|
if (!CheckTokenMembership(nullptr, adminGroup, &isAdmin)) {
|
||||||
|
isAdmin = FALSE;
|
||||||
|
}
|
||||||
|
FreeSid(adminGroup);
|
||||||
|
}
|
||||||
|
CloseHandle(tokenHandle);
|
||||||
|
}
|
||||||
|
return static_cast<bool>(isAdmin);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user