网上很多关于ShellExecuteEx获取管理员权限的,一搜就是,但这是调用其他程序,那么怎样让自己获得呢?
很简单,调用自己不就得了ヽ( ̄▽ ̄)ノ
程序格式:
#include <windows.h>
VOID ManagerRun(LPCSTR exe, LPCSTR param, INT nShow)
{ //注意:会跳出提示。
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "runas";
ShExecInfo.lpFile = exe;
ShExecInfo.lpParameters = param;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = nShow;
ShExecInfo.hInstApp = NULL;
BOOL ret = ShellExecuteEx(&ShExecInfo);
//等不及了,不等了。
CloseHandle(ShExecInfo.hProcess);
return;
}
int main(int argc, char *argv[])
{
if(argc == 1) //初次运行,即双击EXE
{
ShowWindow(GetConsoleWindow(),SW_HIDE);
ManagerRun(argv[0],"2", SW_SHOWNORMAL);
return 1;
}else if(argc == 2) //再次运行,即上面那个ManagerRun
{
/*你的程序主代码在此*/
}
return 0;
}
就是那么简单!
注意:须添加隐藏控制台的语句,否则会冒出2个控制台!!
我是加了那个ShowWindow,可以用更好的方法,
参考 https://blog.csdn.net/cjz2005/article/details/104362669
2024/4
上面是初中的时候写的,别留意()
如果第一次本来就是管理员,第一次自运行就是毫无用处的。于是这段代码是改进版本:
#include <windows.h>
BOOL IsRunAsAdmin(HANDLE hProcess)
{ //是否有管理员权限
if (!hProcess)
hProcess = GetCurrentProcess();
BOOL bElevated = FALSE;
HANDLE hToken = NULL; // Get current process token
if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
return FALSE;
TOKEN_ELEVATION tokenEle;
DWORD dwRetLen = 0; // Retrieve token elevation information
if (GetTokenInformation(hToken, TokenElevation, &tokenEle, sizeof(tokenEle), &dwRetLen))
{
if (dwRetLen == sizeof(tokenEle))
{
bElevated = tokenEle.TokenIsElevated;
}
}
CloseHandle(hToken);
return bElevated;
}
// from https://blog.csdn.net/chenlycly/article/details/45419259
VOID ManagerRun(LPCSTR exe, LPCSTR param, INT nShow)
{ //Run as admin
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "runas";
ShExecInfo.lpFile = exe;
ShExecInfo.lpParameters = param;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = nShow;
ShExecInfo.hInstApp = NULL;
BOOL ret = ShellExecuteEx(&ShExecInfo);
CloseHandle(ShExecInfo.hProcess);
}
int main(int argc, char *argv[])
{
if (!IsRunAsAdmin(NULL)) //方便快捷
{
ShowWindow(GetConsoleWindow(),SW_HIDE);
ManagerRun(argv[0],"2");
return 1;
}else{
/*你的程序主代码在此*/
}
return 0;
}
这样方便多了