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

在服务中创建用户进程的方法(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 
        }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111073.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Lucene教程具体解释

    Lucene教程具体解释

    2021年12月10日
  • Mac(OSX)下媲美XShell的神器Termius「建议收藏」

    Mac(OSX)下媲美XShell的神器Termius「建议收藏」文章目录简介特点软件环境配置配置项配置密钥配置说明配置主机配置项简介XShell的大名不用多说,称它为Windows平台最好用的远程终端不为过吧。唯一不足的地方就是它只有Windows版本。所以今天跟大家介绍一款全平台的远程终端——Termius。Termius不仅涵盖了Windows、Linux、OSX,还变态得支持Android和iOS(以后在地铁、公交上都可以随时拿出手机来排查线上问题啦…………

  • 下载jieba 库[通俗易懂]

    下载jieba 库[通俗易懂]步骤:1.打开命令行2.联网3.在C:\Users\User>后面加语句 pipinstalljieba形成 C:\Users\User>pipinstalljieba然后按回车,然后就开始安装在最后一行出现Successfullyinstalledjieba-0.39 证明安装成功  PS由于我们用pip来安装的jieba库嘛…

  • PHP获取指定月份的第一天开始和最后一天结束的时间戳函数

    一个php获取月中第一天和最后一天的函数,网上搜集的函数,不过这个函数感觉实现的有点繁琐了.本篇文章推荐阅读里也有一篇同样的函数,大家也可以看一下.推荐:http://www.cnblogs.com

    2021年12月24日
  • ArcGIS二次开发知识点总结「建议收藏」

    ArcGIS二次开发知识点总结「建议收藏」空间分析定义:空间分析是指分析具有空间坐标或相对位置的数据和过程的理论和方法,是对地理空间现象的定量研究,其目的在于提取并传输空间数据中隐含的空间信息。叠置分析定义:是指将同一坐标系统下不同信息表达的两组或多组专题要素的图层进行叠加,从而产生一个新图层的过程缓冲区分析定义:是指根据分析对象的点、线、面实体,自动建立其周围一定距离的带状区,用以识别这些实体或者主体对邻近对象的辐射范围或者…

  • 用js来实现那些数据结构06(队列)

    其实队列跟栈有很多相似的地方,包括其中的一些方法和使用方式,只是队列使用了与栈完全不同的原则,栈是后进先出原则,而队列是先进先出(FirstInFirstOut)。一、队列队列是一种特殊的线

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号