117.info
人生若只如初见

Win8 CreateProcessAsUser管理员权限问题

在Windows 8中,要使用CreateProcessAsUser函数以管理员身份运行进程,需要执行以下步骤:

  1. 获取管理员访问令牌:使用OpenProcessToken函数打开当前进程的访问令牌。

  2. 创建新的访问令牌:使用DuplicateTokenEx函数复制管理员访问令牌,并设置访问权限为TOKEN_ALL_ACCESS。

  3. 获取管理员用户的会话ID:使用WTSGetActiveConsoleSessionId函数获取当前活动的控制台会话ID。

  4. 获取与控制台会话关联的用户令牌:使用WTSQueryUserToken函数获取与指定会话ID关联的用户令牌。

  5. 使用CreateProcessAsUser函数以管理员身份运行进程:将步骤2中创建的管理员访问令牌和步骤4中获取的用户令牌传递给CreateProcessAsUser函数。

以下是一个使用CreateProcessAsUser函数以管理员身份运行进程的示例代码:

#include 
#include 
#include 
BOOL CreateProcessAsAdmin(LPCWSTR wszPath)
{
HANDLE hToken;
HANDLE hDupToken;
DWORD dwSessionId;
HANDLE hUserToken;
PROCESS_INFORMATION pi;
STARTUPINFO si;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
{
return FALSE;
}
if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hDupToken))
{
CloseHandle(hToken);
return FALSE;
}
if (!ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionId))
{
CloseHandle(hToken);
CloseHandle(hDupToken);
return FALSE;
}
if (!WTSQueryUserToken(dwSessionId, &hUserToken))
{
CloseHandle(hToken);
CloseHandle(hDupToken);
return FALSE;
}
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"winsta0\\default";
BOOL bResult = CreateProcessAsUserW(hDupToken, NULL, wszPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
CloseHandle(hToken);
CloseHandle(hDupToken);
CloseHandle(hUserToken);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return bResult;
}
int wmain(int argc, wchar_t* argv[])
{
LPCWSTR wszPath = L"C:\\Path\\To\\Your\\Executable.exe";
if (CreateProcessAsAdmin(wszPath))
{
wprintf(L"Process started successfully!\n");
}
else
{
wprintf(L"Failed to start process!\n");
}
return 0;
}

请注意,为了编译此示例代码,需要链接Userenv.lib和Wtsapi32.lib库文件。另外,需要在程序中使用管理员权限运行,否则OpenProcessToken函数将失败。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe641AzsLCQdVAlQ.html

推荐文章

  • win8怎么用 win8使用小技巧

    使用Win8的小技巧包括但不限于以下几点: 使用Windows键:按下键盘上的Windows键可以打开开始屏幕,也可以直接切换到桌面模式。 快速搜索:在开始屏幕上按下Wind...

  • Win8无线网络受限或无线网络无法连接怎么办

    如果Win8无线网络受限或无法连接,可以尝试以下解决方法: 检查无线网络连接:确保无线网络开关已打开,检查是否连接到正确的无线网络,并确保输入的密码正确。 ...

  • Win8.1 update怎么升级

    要升级到Win8.1,您可以按照以下步骤操作: 确保您的电脑符合升级的要求:拥有合适的硬件配置和操作系统版本。 在开始菜单中搜索"Windows Update"并打开Windows更...

  • Win8无线网络无法连接如何解决

    要解决Windows 8无法连接无线网络的问题,可以尝试以下方法: 检查无线网络适配器是否已启用:在桌面模式下,按下Win + X键,选择“设备管理器”,展开“网络适配...

  • win10系统使用键盘过滤驱动问题

    Win10系统的键盘过滤驱动问题可能是由以下几个方面引起的: 驱动问题:首先要确保键盘的驱动程序是最新的。可以去制造商的官方网站上下载最新的驱动程序,并进行...

  • 关于ADO中用_RecordsetPtr记录集添加记录的问题

    在ADO中,可以使用_RecordsetPtr来添加记录到记录集中。下面是一个示例代码:
    // 创建记录集对象
    _RecordsetPtr pRecordset("ADODB.Recordset");

  • adodataset的属性CursorLocation设为clUseServer

    当将ADODataset的属性CursorLocation设为clUseServer时,表示使用服务器端的游标位置。这意味着查询结果将在服务器上计算,并且只有在需要访问数据时才会将数据传...

  • 异常RuntimeException如何解决呢

    RuntimeException是一种运行时异常,通常是由程序逻辑错误或环境异常引起的。解决RuntimeException的方法取决于具体情况,一般可以采取以下几种方式: 异常捕捉和...