现在我想通过SYSTEM权限的进程启动一个新的进程,这个新的进程可能运行在不同的用户权限下,比如可能是User用户,也可能Guest用户,或者是Administrator用户。这个新的进程在根据不同用户权限访问不同信息,比如文件、注册表项等,同时这个新进程还能访问一些具有Administrator权限的函数。我本来想通过ZwCreateToken创建一个用户令牌,使这个令牌所在的组为Administrators组,然后同过CreateProcessAsUser函数就可以创建一个运行在相应的用户下,同时具有Administrator权限的进程,可是使用ZwCreateToken有限制,同时创建的进程功能有限制,不能达到要求。但是,通过LogonUser创建的令牌就没有这些限制,但是它不能设置用户所在的组。对于这些,我参考了Zhefu Zhang的RunUser的RunAsEx程序,有兴趣可以看一看!

解决方案 »

  1.   

    ImpersonateLoggedOnUser()
    AdjustTokenPrivileges()不知道是否有用,感觉楼主的需求不够明确。
      

  2.   

    因为没有才问的!通过修改RunAsEx可以在User用户下实现具有Administrator权限组的程序,那个是调用ZwCreateToken创建的令牌,然后再通过CreateProcessAsUser可以启动,但是启动后功能有限制,而且和你使用的用户没有关系,就是你使用Administrator创建的这个进程,依然有限制。通过LogonUser创建的令牌就没有这个问题,我现在就想知道LogonUser是怎么实现的就好了。
    对于“seansoe(我想我是海) ”说得方法是不可用的,因为那个使用在当前线程中。我是想创建一个新的进程,这个新的进程运行的其他用户权限下,但是具有Administrator权限。正常情况下,比如使用User用户权限运行的程序,只具有User用户权限,不能用户Administrator权限。我现在希望运行在User用户权限下的进程依然拥有Administrator权限,当然是通过高级用户权限进程来提升这个低级进程的权限了。
      

  3.   

    Runas可以通过获取某个用户密码(可能是管理员)来提升运行程序的权限。
      

  4.   

    有人知道怎么使用LsaLogonUser这个函数吗?LogonUser就是调用这个函数实现的
      

  5.   

    有人知道怎么使用LsaLogonUser这个函数吗?LogonUser就是调用这个函数实现的
      

  6.   

    有人知道怎么使用LsaLogonUser这个函数吗?LogonUser就是调用这个函数实现的
      

  7.   

    有人知道NdrClientCall2这个函数怎么使用吗?
      

  8.   

    楼主,你说的NdrClientCall2这个函数在MSDN上有例子!
    This sample demonstrates how to write a program that uses pipes for transferring data between the client and the server. The client sends a file to the server using pipes. The server then "encodes" the data by adding 1 to every element in the file, and then sends the file back using pipes. The pipe used in this sample program is a in/out pipe.This program also allows the user to compile either for UNICIODE or ANSI.
      

  9.   

    Pipes: Sample of Client/Server Pipes
      

  10.   

    顺便问一下楼主,我插入了一个线程到WinLogon.exe 取得了System 权限,但我在这个线程里不管是显示一个MessageBox还是建立一个进程,它们都是不可见的,但却确实在运行,请问这是什么原因啊。有什么办法解决呢?(用CreateProcessAsUser可以,但建立的这个进程与我的线程也无法通信)
      

  11.   

    Search 
    Starting an Interactive Client Process in C++
    In MSDN.
      

  12.   

    to mjcom(不明飞行物) :
    我觉得你的问题应该是:对话框实际上已经显示出来了,只不过被其他窗口盖住了。还有如果你想在两个进程间通讯,比如使用互斥量、共享内存方式等,在创建互斥量对象或者共享内存对象时必须设置访问权限,不然运行在其他用户权限下的进程可能无法访问该对象。
      

  13.   

    不知这样行不行?
    在启动的进程中,先用ImpersonateLoggedOnUser让进程扮演Users用户,需要Administrators权限时,再用RevertToSelf切换回SYSTEM。
      

  14.   

    现在有一个新的问题,就是使用LogonUser和CreateProcessAsUser函数创建的进程,在系统注销的时候该进程不能被自动结束掉,而且再次登录时将会一直产生一个错误!
      

  15.   

    To mjcom(不明飞行物)
    比如你使用CreateMutex创建一个互斥量对象,它有三个参数:第一个是安全属性,平时当需要进行同步的两个进程处在同一个用户下时不需要设置,只要给个NULL值即可。可是如果两个进程没有运行在同一个用户下时,比如WinLogon.exe运行在SYSTEM权限,普通程序运行在你当前登录的用户下,这样你Winlogon.exe进程中创建的互斥量对象在普通程序进程中就无法打开这个这个互斥对象,这时就需要设置这个互斥对象的安全属性参数。我一般都设置安全属性参数为EveryOne属性,这样任何进程都可以访问了。
      

  16.   

    谢谢你,天蓝,但如果我在当前登陆的用户下建立互斥体,然后在WinLogon.exe中打开,这样会成功吗?
      

  17.   

    To mjcom(不明飞行物)
    这个我不知道,你自己试一下吧!