C# 如何从Windows 7服务在会话1中启动进程

C# 如何从Windows 7服务在会话1中启动进程,c#,windows-7,service,C#,Windows 7,Service,我有一个在Windows7中运行的服务。在Windows 7中,所有服务都在会话0中运行。从该服务中,我希望创建一个交互式用户会话(在会话0以外的会话中),并在该会话中启动应用程序。我的问题是,当我调用LogonUser启动交互式用户会话,然后使用CreateProcessAsUser启动应用程序时,应用程序最终在会话0中运行 我所有的代码都是C# 以下是相关代码: [DllImport("advapi32.dll", SetLastError=true)] static extern bool

我有一个在Windows7中运行的服务。在Windows 7中,所有服务都在会话0中运行。从该服务中,我希望创建一个交互式用户会话(在会话0以外的会话中),并在该会话中启动应用程序。我的问题是,当我调用LogonUser启动交互式用户会话,然后使用CreateProcessAsUser启动应用程序时,应用程序最终在会话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");
[DllImport(“advapi32.dll”,SetLastError=true)]
静态外部布尔用户(
字符串主体,
字符串权限,
字符串密码,
UInt32 logonType,
UInt32标识提供程序,
输出IntPtr令牌);
[DllImport(“advapi32.dll”,SetLastError=true)]
静态外部布尔CreateProcessAsUser(
IntPtr hToken,
字符串lpApplicationName,
字符串命令行,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
布尔·宾赫里桑德斯,
int dwCreationFlags,
IntPtr LPR环境,
字符串lpCurrentDirectory,
参考STARTUPINFO和STARTUPINFO,
ref过程信息(lpProcessInformation);
IntPtr令牌;
LogonUser(“用户名”、“密码”),
LogonTypes.Interactive、LogonProviders.Default、out令牌)
<模拟用户的代码>
字符串hd=Environment.ExpandEnvironmentVariables(“%USERPROFILE%”);
IntPtr envBlock=IntPtr.Zero;
CreateProcessAsUser(令牌,“PathToMenu.exe”,
普通_优先级|类|创建_UNICODE |环境,
“WinSta0\\Default”,高清,环境块,“菜单”);

有人能告诉我我做错了什么吗?

在Vista/7中尝试从服务启动流程时,可能会出现很多问题。我建议你们从这篇文章开始,根据你们的需要修改它。我可以告诉你,我已经在文章中使用和修改了很多代码,而且它很有效。很抱歉,我不能向您展示它,因为修改后的代码属于我的公司。

Matt-非常感谢-我想这会让我继续。我希望能够在没有用户登录的情况下处理这个问题,使用LogonUser创建用户会话。这在WinXP中运行得很好,但在带有Session0隔离的Win7中不行。这对我帮助很大。。。给了我一个解决问题的基础。1User856021,你好,兄弟,如果你已经解决了你的问题,那么你能发布它的代码吗?我使用的是windows 8,运行时也遇到同样的问题。