取explorer的令牌调用CreateProcessAsUser产生1314的错误?

hiloves 2016-03-27 12:00:39
第一个程序“以管理员身份运行”,这个程序要调用另一个程序时不希望再“以管理员身份运行”,于是取explorer的令牌再用这个令牌去调用另一个程序,可是调用CreateProcessAsUser产生1314的错误。
HANDLE GetProcessByName(TCHAR* name)
{
DWORD pid = 0;

// Create toolhelp snapshot.
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);

// Walkthrough all processes.
if (Process32First(snapshot, &process))
{
do
{
// Compare process.szExeFile based on format of name, i.e., trim file path
// trim .exe if necessary, etc.
if (0 == _tcscmp(_tcslwr(process.szExeFile), _tcslwr(name)))
{
pid = process.th32ProcessID;
break;
}
} while (Process32Next(snapshot, &process));
}

CloseHandle(snapshot);

if (pid != 0)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
}

// Not found
return NULL;
}

BOOL CreateProcess(PWSTR pszCommandLine)
{
DWORD dwError = ERROR_SUCCESS;
HANDLE hToken = NULL;
HANDLE hNewToken = NULL;
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi = { 0 };

// Open the primary access token of the process.
if (!OpenProcessToken(GetProcessByName(_T("explorer.exe")), TOKEN_DUPLICATE | TOKEN_QUERY |
TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY, &hToken))
{
dwError = GetLastError();
goto Cleanup;
}
if (!DuplicateTokenEx(hToken, 0, NULL, SecurityImpersonation,
TokenPrimary, &hNewToken))
{
dwError = GetLastError();
goto Cleanup;
}
if (!CreateProcessAsUser(hNewToken, pszCommandLine, NULL, NULL, NULL,
FALSE, 0, NULL, NULL, &si, &pi))
{
dwError = GetLastError();
goto Cleanup;
}

Cleanup:
// Centralized cleanup for all allocated resources.
if (hToken)
{
CloseHandle(hToken);
hToken = NULL;
}
if (ERROR_SUCCESS != dwError)
{
// Make sure that the error code is set for failure.
SetLastError(dwError);
return FALSE;
}
else
{
return TRUE;
}
}
...全文
373 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-03
  • 打赏
  • 举报
回复
客户端没有所需的特权。 仅供参考:
bool AdjustPrivileges() {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    TOKEN_PRIVILEGES oldtp;
    DWORD dwSize=sizeof(TOKEN_PRIVILEGES);
    LUID luid;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;
        else return false;
    }
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
        CloseHandle(hToken);
        return false;
    }
    ZeroMemory(&tp, sizeof(tp));
    tp.PrivilegeCount=1;
    tp.Privileges[0].Luid=luid;
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    /* Adjust Token Privileges */
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
        CloseHandle(hToken);
        return false;
    }
    // close handles
    CloseHandle(hToken);
    return true;
}
hiloves 2016-05-03
  • 打赏
  • 举报
回复
沉了。。。。。。。。。。。。。。。。
hiloves 2016-03-28
  • 打赏
  • 举报
回复
沉了。。。。。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧