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

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

(0)
上一篇 2021年7月25日 下午12:00
下一篇 2021年7月25日 下午1:00


相关推荐

  • cacheable更新_Spring之缓存注解@Cacheable

    cacheable更新_Spring之缓存注解@Cacheable从 3 1 开始 Spring 引入了对 Cache 的支持 其使用方法和原理都类似于 Spring 对事务管理的支持 SpringCache 是作用在方法上的 其核心思想是这样的 当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中 等到下次利用同样的参数来调用该方法时将不再执行该方法 而是直接从缓存中获取结果进行返回 所以在使用 SpringCache 的时候我们要保证我们缓存的方法对

    2026年3月18日
    2
  • Stata字符型与数值型数据的转换——上市公司证券代码字符型与数值型的互换

    Stata字符型与数值型数据的转换——上市公司证券代码字符型与数值型的互换实现效果假设 000001 000012 000123 002345 为某些上市公司证券代码 上市公司实证研究中 常常需要用到上市公司证券代码 将字符型转为数值型比较容易 直接用 destring 命令即可实现 但是数值型转为字符型并且补齐 6 位数的命令比较少见 字符型转为数值型 destringStkc replace 数值型转为字符型 tostringStkc

    2025年9月19日
    6
  • Flink_企业级风控平台架构建设_01

    Flink_企业级风控平台架构建设_01实时风控系统设计

    2026年3月18日
    2
  • gridview属性_文档代码

    gridview属性_文档代码Common{//////样式类///publicclassControlStyle{//////设置girdView默认属性//////publicstaticvoidSetStyle(DevExpress.XtraGrid.Vie

    2025年12月5日
    4
  • react路由传参的几种方式[通俗易懂]

    react路由传参的几种方式[通俗易懂]第一种传参方式,动态路由传参通过设置link的path属性,进行路由的传参,当点击link标签的时候,会在上方的url地址中显示传递的整个url<Linkto=’/home?name=dx’>首页</Link>如果想真正获取到传递过来的参数,需要在对应的子组件中this.props.location.search获取字符串,再手动解析因为传参能够被用户看见…

    2022年6月11日
    99
  • 缓存一致性协议(MESI)——缓存加锁协议

    缓存一致性协议(MESI)——缓存加锁协议参考自 缓存一致性协议 MESI 简书存储器层次结构中 最快速的就是 cpu 一级别在目前主流的计算机中 cpu 执行计算的主要流程如图所示 数据加载的流程如下 将程序和数据从硬盘加载到内存中将程序和数据从内存加 https www jianshu com p ce47091ccd5b 存储器层次结构中 最快速的就是 cpu 一级别在目前主流的计算机中 cpu 执行计算的主要流程如图所示 数据加载的流程如下 将程序和数据从硬盘加载到内存中将程序和数据从内存加载到缓存中 目

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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