在服务中创建用户进程的方法(C#版)

Windows NT/2000提供了一个函数CreateProcessAsUser,它的功能类似于CreateProcess函数,所不同的是CreateProcessAsUser创建的新进程能以用户(任何用户)的安全上下文方式运行。

  1  //  PlatformInvoke Stuff
  2          [StructLayout(LayoutKind.Sequential)]
  3           struct  STARTUPINFO
  4          {
  5               public  Int32 cb;
  6              [MarshalAs(UnmanagedType.LPTStr)]
  7               public  String lpReserved;
  8              [MarshalAs(UnmanagedType.LPTStr)]
  9               public  String lpDesktop;
 10              [MarshalAs(UnmanagedType.LPTStr)]
 11               public  String lpTitle;
 12               public  UInt32 dwX;
 13               public  UInt32 dwY;
 14               public  UInt32 dwXSize;
 15               public  UInt32 dwYSize;
 16               public  UInt32 dwXCountChars;
 17               public  UInt32 dwYCountChars;
 18               public  UInt32 dwFillAttribute;
 19               public  UInt32 dwFlags;
 20               public  Int16 wShowWindow;
 21               public  Int16 cbReserved2;
 22               public  IntPtr lpReserved2;
 23               public  HandleRef hStdInput;
 24               public  HandleRef hStdOutput;
 25               public  HandleRef hStdError;
 26          }
 27 
 28           const   int  NORMAL_PRIORITY_CLASS  =   0x00000020 ;
 29 
 30           struct  PROCESS_INFORMATION
 31          {
 32               public  HandleRef hProcess;
 33               public  HandleRef hThread;
 34               public  UInt32 dwProcessId;
 35               public  UInt32 dwThreadId;
 36          }
 37 
 38           struct  SECURITY_ATTRIBUTES
 39          {
 40               public  UInt32 nLength;
 41               public  IntPtr lpSecurityDescriptor;
 42               public  Boolean bInheritHandle;
 43          }
 44 
 45          [DllImport( " advapi32.dll " , CharSet  =  CharSet.Unicode)]
 46           static   extern  Boolean CreateProcessAsUser(
 47          IntPtr hToken,
 48          String lpApplicationName,
 49          String lpCommandLine,
 50          IntPtr lpProcessAttributes,
 51          IntPtr lpThreadAttributes,
 52          Boolean bInheritHandles,
 53          UInt32 dwCreationFlags,
 54          IntPtr lpEnvironment,
 55          String lpCurrentDirectory,
 56           ref  STARTUPINFO lpStartupInfo,
 57           out  PROCESS_INFORMATION lpProcessInformation);
 58 
 59          [DllImport( " advapi32.dll " , CharSet  =  CharSet.Unicode)]
 60           static   extern  Boolean LogonUser(
 61          String lpszUsername,
 62          String lpszDomain,
 63          String lpszPassword,
 64          Int32 dwLogonType,
 65          Int32 dwLogonProvider,
 66           ref  IntPtr phToken
 67          );
 68           const   int  LOGON32_LOGON_INTERACTIVE  =   2 ;
 69 
 70           public   void  Execute( string  File)
 71          {
 72               try
 73              {
 74                   // unsafe
 75                  {
 76                      PROCESS_INFORMATION pi  =   new  PROCESS_INFORMATION();
 77 
 78                      STARTUPINFO si  =   new  STARTUPINFO();
 79                      si.cb  =  Marshal.SizeOf(si);
 80                      si.lpDesktop  =   " winsta0\\default " ;
 81 
 82                      IntPtr hToken  =   new  IntPtr( 0 );
 83                       if  (LogonUser( " auser " " mydomain " " Passw0rd! " ,
 84                          LOGON32_LOGON_INTERACTIVE,  0 ref  hToken))
 85                      {
 86                          Boolean bResult  =  CreateProcessAsUser(
 87                              hToken,
 88                              File,  //  file to execute
 89                               null //  command line
 90                              IntPtr.Zero,  //  pointer to process SECURITY_ATTRIBUTES
 91                              IntPtr.Zero,  //  pointer to thread SECURITY_ATTRIBUTES
 92                               false //  handles are not inheritable
 93                               0 //  creation flags
 94                              IntPtr.Zero,  //  pointer to new environment block
 95                               null //  name of current directory
 96                               ref  si,  //  pointer to STARTUPINFO structure
 97                               out  pi  //  receives information about new process
 98                              );
 99 
100                           if  (bResult)
101                          {
102                          }
103                      }
104                  }
105              }
106               catch (Exception e)
107              {
108              }
109          }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值