【问题标题】:CreateProcessAsUser doesn't work in windows serviceCreateProcessAsUser 在 Windows 服务中不起作用
【发布时间】:2018-04-16 03:00:31
【问题描述】:

我想在 C++ 中创建一个 Windows 服务,以便在用户每次登录时以管理员身份启动我的程序而不弹出 UAC 窗口

因为这是我第一次这样做,所以我使用了这里的项目: https://code.msdn.microsoft.com/windowsapps/CppWindowsService-cacf4948/view/SourceCode

我将 CppWindowsService.cpp 中的第 74 行编辑为:

InstallService(
            SERVICE_NAME,               // Name of service
            SERVICE_DISPLAY_NAME,       // Name to display
            SERVICE_AUTO_START,         // Service start type
            SERVICE_DEPENDENCIES,       // Dependencies
            0,            // Service running account
            SERVICE_PASSWORD            // Password of the account
            );

并在 SampleService.cpp 第 101 行的工作线程中添加了一些代码,变成这样:

void CSampleService::ServiceWorkerThread(void)
{
// Periodically check if the service is stopping.
while (!m_fStopping)
{
    // Perform main service function here...

    HANDLE hToken = NULL, dToken;
    WTSQueryUserToken(WTSGetActiveConsoleSessionId(), &hToken);
    DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, 0, SecurityIdentification, TokenPrimary, &dToken);
    STARTUPINFO stinfo = { 0 };
    PROCESS_INFORMATION pinfo = { 0 };
    stinfo.cb = sizeof(stinfo);
    stinfo.lpDesktop = L"winsta0\\default";
    LPVOID pEnv = 0;
    CreateEnvironmentBlock(&pEnv, dToken, 0);
    CreateProcessAsUserW(dToken, L"F:\\test.exe",0, 0, 0, 0,CREATE_NEW_CONSOLE, pEnv, 0, &stinfo, &pinfo);

    ::Sleep(2000);  // Simulate some lengthy operations.
}

// Signal the stopped event.
SetEvent(m_hStoppedEvent);
}

位于 F 驱动器的 test.exe 显示一个消息框,但是当我尝试从服务运行它时,虽然我可以轻松地使用 CreateProcess 从普通程序中执行它,但什么也没有发生

编辑:我也尝试在 CreateProcessAsUser 中放置一个命令行,但没有任何反应

【问题讨论】:

  • 查看CreateProcessAsUserW的返回值,如果是FALSE调用GetLastError找出问题所在
  • 你叫什么DuplicateTokenEx
  • DestroyEnvironmentBlock 必须是
  • 不要复制token,创建进程后关闭hToken。希望您在完成后也关闭pinfo 返回的进程和线程句柄。
  • 这里更大的问题是设计错误。 “每次用户登录时以管理员身份启动我的程序”。服务在特定用户登录之前启动。

标签: c++ windows winapi service


【解决方案1】:

我在函数中使用了CREATE_UNICODE_ENVIRONMENT作为创建标志,问题解决了

【讨论】:

  • 还有一个问题,创建的进程没有以管理员身份运行,它以普通用户身份运行,但服务以 SYSTEM 身份运行
  • 因为您以非提升用户身份运行它,而不是作为 SYSTEM。看看这篇文章:Vista UAC: The Definitive Guide。它实现了一个自定义的CreateProcessAsUserElevated() 函数(等等)。
  • 我使用 SetTokenInformation 和 TokenElevationType 和 TokenElevation 来提升重复的令牌但没有用,我也没有在 microsoft 文档中找到 CreateProcessAsUserElevated 并且它在 Visual Studio 的 c++ sdk 中也不存在。我使用的是 windows 8.1 sdk
  • 如果来自WTSQueryUserToken的会话用户的token具有提升类型TokenElevationTypeLimited,那么您需要通过TokenLinkedToken获取用户的TokenElevationTypeFulltoken。完整令牌具有高级别、管理员访问权限和全套管理员权限。显然,您需要拥有并启用 SeTcbPrivilege 才能将其作为主要令牌。
  • @prog511 更仔细地阅读我之前的评论。我没有说CreateProcessAsUserElevated() 是微软的功能。这是我链接到的文章作者创建的自定义函数。
猜你喜欢
  • 2020-03-04
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
相关资源
最近更新 更多