【问题标题】:How to Start a Process in Session 1 from a Windows 7 Service如何从 Windows 7 服务启动会话 1 中的进程
【发布时间】:2011-12-11 01:41:15
【问题描述】:

我有一个在 Windows 7 中运行的服务。在 Windows 7 中,所有服务都在会话 0 中运行。我想从该服务创建一个交互式用户会话(在会话 0 以外的会话中)并在该会话中启动一个应用程序。我的问题是,当我调用 LogonUser 启动交互式用户会话,然后使用 CreateProcessAsUser 启动应用程序时,应用程序最终在 Session 0 中运行。

我所有的代码都是 C#。

以下是相关代码:

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool LogonUser(
    string principal,
    string authority,
    string password,
    UInt32 logonType,
    UInt32 logonProvider,
    out    IntPtr token);

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool CreateProcessAsUser(
    IntPtr hToken,
    string lpApplicationName,
    string lpCommandLine,
    IntPtr lpProcessAttributes,
    IntPtr lpThreadAttributes,
    bool bInheritHandles,
    int dwCreationFlags,
    IntPtr lpEnvironment,
    string lpCurrentDirectory,
    ref STARTUPINFO lpStartupInfo,
    ref PROCESS_INFORMATION lpProcessInformation);

IntPtr token;
LogonUser("UserName", ".", "Password", 
    LogonTypes.Interactive,LogonProviders.Default, out token)

<code to impersonate user>
string hd = Environment.ExpandEnvironmentVariables("%USERPROFILE%");

IntPtr envBlock = IntPtr.Zero;
CreateProcessAsUser(token, "PathToMenu.exe",
    NORMAL_PRIORITY_CLASS |CREATE_UNICODE_ENVIRONMENT,
    "WinSta0\\Default", hd, envBlock, "Menu");

谁能告诉我我做错了什么?

【问题讨论】:

  • User856021,你好兄弟,如果你已经解决了你的问题,你可以发布它的代码吗?我正在使用 Windows 8 并遇到同样的问题。

标签: c# windows-7 service


【解决方案1】:

尝试从 Vista/7 中的服务启动进程时,可能会出现很多问题。我建议您从 this 文章开始并根据您的需要进行调整。我可以告诉你,我已经对文章中的代码进行了相当多的使用和修改,并且它确实有效。很抱歉我不能给你看,因为修改后的代码是我公司的。

【讨论】:

  • Matt - 非常感谢 - 我想这会让我继续前进。我曾希望能够在没有用户登录的情况下处理这种情况,使用 LogonUser 创建用户会话。这在 WinXP 中工作得很好,但在带有 Sessioin0 隔离的 Win7 中却不行。
  • 这对我帮助很大...为我提供了解决问题的基础。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多