在标准用户中以提升的特权运行交互式应用程序

问题描述

我正在尝试打开一个在标准用户的桌面内以SYstem帐户运行的交互式应用程序(该交互式应用程序具有管理权限)。我知道由于会话隔离等原因通常是不可能的。但是,我目睹了这样做的应用程序。

#pragma comment(lib,"advapi32.lib")

using namespace std;

STARTUPINFO GetStartupInfo()
{
    STARTUPINFO startupInfo;
    ZeroMemory(&startupInfo,sizeof(startupInfo));

    startupInfo.cb = sizeof(startupInfo);
    startupInfo.lpDesktop = const_cast<LPWSTR>(_T("Winsta0\\default"));
    startupInfo.dwFlags = STARTF_USESHOWWINDOW;
    startupInfo.wShowWindow = SW_SHOW;


    return startupInfo;
}

HANDLE SetInfoOnToken(HANDLE existingToken)
{
    HANDLE duplicatetoken;
    DWORD TokenSessionId = 1;
    DuplicatetokenEx(existingToken,MAXIMUM_ALLOWED,nullptr,Security_IMPERSONATION_LEVEL::SecurityIdentification,TOKEN_TYPE::TokenPrimary,&duplicatetoken);
    SetToken@R_453_4045@ion(duplicatetoken,TOKEN_@R_453_4045@ION_CLASS::TokenSessionId,&TokenSessionId,sizeof(TokenSessionId));

    return duplicatetoken;
}

bool SetTcbPrivilege(HANDLE hToken)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
    bool success = LookupPrivilegeValue(NULL,_T("SeTcbPrivilege"),&luid);

    if (!success) {
        wcout << GetLastError();
        return false;
    }
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!AdjustTokenPrivileges(&hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL))
    {
        printf("AdjustTokenPrivileges error: %u\n",GetLastError());
        return false;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) return false;
}

int _tmain(int argc,TCHAR *argv[],TCHAR *envp[])
{
    wstring processName = _T("notepad.exe");
    TCHAR* name = (wchar_t*)processName.c_str();
    DWORD sessionId = 0;
    STARTUPINFO startupInfo = GetStartupInfo();
    PROCESS_@R_453_4045@ION process@R_453_4045@ion;
    HANDLE processHandle = nullptr;
    ZeroMemory(&process@R_453_4045@ion,sizeof(process@R_453_4045@ion));
    HANDLE hToken = GetCurrentProcesstoken();
    SetTcbPrivilege(hToken);
    hToken = SetInfoOnToken(hToken);
    bool success = false;

    success = CreateProcessAsUser(hToken,name,false,&startupInfo,&process@R_453_4045@ion);

    if (success)
    {
        wcout << "Process started.\n";
    }
    else
    {
        wcout << "There was a problem starting the process.\n";
        wcout << GetLastError();
        return 0;
    }

    CloseHandle(process@R_453_404[email protected]);
    CloseHandle(process@R_453_404[email protected]);
    return 0;
}

正常启动时,此代码可完美运行。但是,当使用SYstem帐户运行时,它不会显示记事本窗口(我知道通常不应该这样,但这是我试图克服的限制,并且看到某些应用程序正在这样做)。但是,任务管理器中列出了记事本的过程。

返回此意外行为的代码中我缺少什么?对于这种情况,我的样本较少,因此请提供任何建议。

编辑:

此时,该进程未运行,并留下ERROR_INVALID_HANDLE错误。我做错了什么?请提出建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)