• session winstaion impersonate


    1,一个session中可以拥有多个winstation,一个winstation必然属于某个session,且无法更换。

    2,所有winstation的函数,包括OpenWindowStation,CreateWindowStation,EnumWindowStations等等,均仅限于调用Process的primary token的session。

    3,一个process仅对应一个session,也即其primary token的session。更简单的方法是ProcessIdToSessionId。当然也可以通过查询primary token的方法获得。一个process的thread可以拥有不同的session id,可以通过修改thread token来实现。但没有看出有什么意义。因为这个token并不能用来实现任何和winstation有关的操作。目前仅看到一个作用是在printer port monitor driver中,用来表明打印客户所在的session信息。

    4,process访问同一个session下不同的winstaion是可能的,可以通过SetProcessWinStation来实现。

    5,process访问另一个session下的不同winstaion是不可能的(至少我没有找到方法),即使把当前thread的session id设置为目标session id也不行。再说一次,winstation并不与thread的token有关,它与process的primary token有关。

    6,还不知道如何才能产生一个新的session,因此也不知道如何才能在此session上启动winlogon.exe。也许LsaLogonUser可以,还未详细测试。

    7,Token有2种,primary token和imperanate token。前者仅用于process,后者仅用于thread。2者之间的转换可以用DuplicateTokenEx。

    8,要获得impersonate token有很多方法,在primary token基础上DuplicateTokenEx并且修改,或者通过ImpersonateNamedPipeClient等等。

    9,NamePipe以及RPC在本地通讯时有一个明显优于socket的地方有2点:1,不需要担心port已经被占用;2,拥有权限机制,例如ImpersonateNamedPipeClient。这可以用于界面程序和服务程序交互时的权限控制。如果已经用了socket,那么WTSQueryUserToken是一个替代方案。可以直接获得界面程序所在的session的用户的token,一般来说和界面进程的token一致。

    10,系统提供了大量简化函数以避免反复的调用DuplicateTokenEx。ImpersonateSelf是用于替代如下代码的:

    OpenProcessToken(); 
    DuplicateTokenEx(); 
    SetThreadToken();

    ImpersonateLoggedonUser是用来替换如下代码的:

    any way to get a token for example through 
    LogonOnUser(); DuplicateTokenEx(); or OpenProcessToken();DuplicationTokenEx();SetTokenInformation(); 
    SetThreadToken();

    11,Thread缺省不具有token,因此缺省情况下GetThreadToken会返回ERROR_NO_TOKEN。此种情况下应该判断并调用OpenProcessToken(GetCurentProcess());当Thread被impersonate之后(例如通过SetThreadToken或者ImpersonateSelf,ImpersonateLoggedonUser),GetThreadToken返回当前所设置的Token。

    12,服务中在指定Session中启动进程,一切都取决于CreateProcessAsUser的Token。如果使用服务的Token并且使用SetTokenInformation修改session id,那么启动的进程是属于SYSTEM用户的。如果使用WTSQueryUserToken返回的Token,进程是属于该用户的。也可以枚举该Sesssion的explorer.exe的token。

    13,已经用于Process的Primary Token是几乎无法用SetTokenInformation修改的。能够修改的仅有权限部分。将要用于CreateProcessAsUser的Primary Token可以任意修改。这意味着无法修改一个Process所属的session。 

  • 相关阅读:
    c语言学习指针变量
    SQL字符串函数
    [转]HttpWebRequest使用注意(发生阻塞的解决办法)
    Image.FormFile的锁文件解决
    不联网在win8安装framework3.5
    metro app损坏,修复以及商店速度慢的解决方法
    关于C#使用来电通的来电通内部原理浅析
    winform模拟qq聊天界面的小功能textbox1输入自动跳到textbox2
    C#下的路由器后台登录
    dropbox文件夹路径丢失变回默认文件的解决方法
  • 原文地址:https://www.cnblogs.com/ahuo/p/1997286.html
Copyright © 2020-2023  润新知