none
P/Invoke中如何将uint转为IntPtr RRS feed

  • 问题

  • 因为业务需要实现一个绕过UAC的程序,此程序以windows服务存在,其中在

    uint dwSessionId = WTSGetActiveConsoleSessionId();

    SetTokenInformation(_hTargetToken, TOKEN_INFORMATION_CLASS.TokenSessionId, new IntPtr(dwSessionId),sizeof(UInt32));

    SetTokenInformation返回998错误(内存地址无效)。估计是new IntPtr的问题。



    • 已编辑 xyzdumpling 2012年2月8日 7:07 122错误是声明是的CharSet的问题
    2012年2月8日 5:55

答案

  • 你好 我对这一块不是很熟悉

    不过我参考 了MSDN的相关文档,你首先调试下你获得的SessionId是不是为0;同时请注意权限设置等,如尝试将你的服务设置符合这些权限的角色或者账户运行

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.

    TokenSessionId

    The buffer receives a DWORD value that indicates the Terminal Services session identifier that is associated with the token.

    If the token is associated with the terminal server client session, the session identifier is nonzero.

    Windows Server 2003 and Windows XP:  If the token is associated with the terminal server console session, the session identifier is zero.

    In a non-Terminal Services environment, the session identifier is zero.

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Blog http://kosmisch.net
    Chengdu,China

    2012年2月8日 12:26
    版主
  • 看到一篇文章提到:

    int __stdcall FunctionName(unsigned char &param1, unsigned char *param2)

        在C#中对其进行调用的方法是:

    [DllImport(“ file ”)] 
    extern static int FunctionName(ref byte param1, ref byte param2)

        看到这,可能有人会问,&是取地址,*是传送指针,为何都只用ref就可以了呢?一种可能的解释是ref是一个具有重载特性的修饰符,会自动识别是取地址还是传送指针。”(原文地址

    此处将第三个签名IntPtr类型改为ref uint之后调用成功。问题解决。谢谢各位

    2012年2月13日 7:02

全部回复

  • 你好 我对这一块不是很熟悉

    不过我参考 了MSDN的相关文档,你首先调试下你获得的SessionId是不是为0;同时请注意权限设置等,如尝试将你的服务设置符合这些权限的角色或者账户运行

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.

    TokenSessionId

    The buffer receives a DWORD value that indicates the Terminal Services session identifier that is associated with the token.

    If the token is associated with the terminal server client session, the session identifier is nonzero.

    Windows Server 2003 and Windows XP:  If the token is associated with the terminal server console session, the session identifier is zero.

    In a non-Terminal Services environment, the session identifier is zero.

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Blog http://kosmisch.net
    Chengdu,China

    2012年2月8日 12:26
    版主
  • 谢谢回复。

    用WTSGetActiveConsoleSessionId()获得的结果为1,但是用new IntPtr(dwSessionId),返回的结果也为1,我觉得他应该没取地址。我觉得现在的问题就是如何把uint dwSessionId取址(转换为IntPtr

    2012年2月9日 0:58
  • 看到一篇文章提到:

    int __stdcall FunctionName(unsigned char &param1, unsigned char *param2)

        在C#中对其进行调用的方法是:

    [DllImport(“ file ”)] 
    extern static int FunctionName(ref byte param1, ref byte param2)

        看到这,可能有人会问,&是取地址,*是传送指针,为何都只用ref就可以了呢?一种可能的解释是ref是一个具有重载特性的修饰符,会自动识别是取地址还是传送指针。”(原文地址

    此处将第三个签名IntPtr类型改为ref uint之后调用成功。问题解决。谢谢各位

    2012年2月13日 7:02