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

我有一个在Windows 7中运行的服务.在Windows 7中,所有服务都在会话0中运行.我想从该服务中创建一个交互式用户会话(在非会话0的会话中)并在该会话中启动一个应用程序.我的问题是,当我调用LogonUser启动交互式用户会话...

我有一个在Windows 7中运行的服务.在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");

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

解决方法:

尝试从Vista / 7中的服务启动进程时,可能会出错.我建议您从this文章开始,并使其适应您的需求.我可以告诉您,我已经使用和修改了本文中的代码很多,并且可以正常工作.很抱歉,由于修改后的代码属于我公司,因此无法向您显示.

本文标题为:c#-如何从Windows 7服务在会话1中启动进程

基础教程推荐