问题描述
我正在尝试打开一个在标准用户的桌面内以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 (将#修改为@)