2011-11-16 105 views
7

我试图使用CreateProcessWithTokenW() win32 API函数以令牌启动一个新进程。问题是我对win32 API很陌生,我不知道如何正确使用这个函数,以及需要哪些结构等等。有人能给我提供一个如何在C#中正确使用函数的例子吗?CreateProcessWithTokenW - 在C#中使用的示例

+1

你想从哪里获取令牌?究竟是什么驱使你使用这个功能? –

+0

我猜你正在尝试做类似于此处所述的内容:http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows -service-in-windows-vista-and-later.aspx –

回答

4

这是托管代码,所以你需要使用的P/Invoke(平台调用),下面是CreateProcessWithTokenW()函数签名:

[DllImport("advapi32", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern bool CreateProcessWithTokenW(
    IntPtr hToken, 
    LogonFlags dwLogonFlags, 
    string lpApplicationName, 
    string lpCommandLine, 
    CreationFlags dwCreationFlags, 
    IntPtr lpEnvironment, 
    string lpCurrentDirectory, 
    [In] ref STARTUPINFO lpStartupInfo, 
    out PROCESS_INFORMATION lpProcessInformation); 

您可以使用一个enum这样的LogonFlags参数去传递(以保持.NET的感觉:)):

public enum LogonFlags 
{ 
    WithProfile = 1, 
    NetCredentialsOnly 
} 

这里是为CreationFlags枚举提供的文档here以下

public enum CreationFlags 
{ 
    DefaultErrorMode = 0x04000000, 
    NewConsole = 0x00000010, 
    NewProcessGroup = 0x00000200, 
    SeparateWOWVDM = 0x00000800, 
    Suspended = 0x00000004, 
    UnicodeEnvironment = 0x00000400, 
    ExtendedStartupInfoPresent = 0x00080000 
} 
+0

有关更多信息,请参阅p/invoke.net上的此功能:http://www.pinvoke.net/default.aspx/Structures/CreateProcessWithTokenW.html –

+0

@非常感谢你,经验教训 –

+0

@DavidHeffernan:NP,谢谢关心! – Will