一版一版往前走啦。。。

先安装vs2010的学习版,

然后用codeblock来搞。

有一个msvcr100.dll这个文件需要和代码同级目录。

这样的好处是合规,然后,codeblock也可以用vs的库,然后比c#好的地方是不需要.net支持。

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <Tlhelp32.h>
#include <tchar.h>
#include <psapi.h>
#include <stdio.h>
#include <STDLIB.H>
#include <tlhelp32.h>
#include <WtsApi32.h>
#include <windows.h>
#include <stdio.h>
#include <Userenv.h>
#include <Wtsapi32.h>
#pragma comment(lib, "WtsApi32.lib")
#pragma  comment (lib,"psapi")
#pragma  comment (lib,"user32.lib")
#pragma  comment (lib,"advapi32.lib")
#pragma comment(lib,"ws2_32.lib")

//Function to run a process as active user from windows service
void ImpersonateActiveUserAndRun()
{

    DWORD session_id = -;
    DWORD session_count = ;
    WTS_SESSION_INFOA *pSession = NULL;

    , , &pSession, &session_count))
    {
        printf("pSession=====%d\n", pSession);
        printf("session_count=====%d\n", session_count);
    }
    else
    {
        printf("WTSEnumerateSessions ===============failed \n");
        printf("ERROR: %d", GetLastError());
        return;
    }
    ; i < session_count; i++)
    {
        session_id = pSession[i].SessionId;
        printf("session_id=====%d\n", session_id);

        WTS_CONNECTSTATE_CLASS wts_connect_state = WTSDisconnected;
        WTS_CONNECTSTATE_CLASS* ptr_wts_connect_state = NULL;

        DWORD bytes_returned = ;
        if (::WTSQuerySessionInformation(
            WTS_CURRENT_SERVER_HANDLE,
            session_id,
            WTSConnectState,
            reinterpret_cast<LPTSTR*>(&ptr_wts_connect_state),
            &bytes_returned))
        {
            wts_connect_state = *ptr_wts_connect_state;
            ::WTSFreeMemory(ptr_wts_connect_state);
            //printf("wts_connect_state=====%d\n", wts_connect_state);
            if (wts_connect_state != WTSActive) continue;
        }
        else
        {
            printf("WTSQuerySessionInformation ===============failed \n");
            printf("ERROR: %d", GetLastError());
            return;
        }

        HANDLE hImpersonationToken = ;
        BOOL bRet = WTSQueryUserToken(session_id, &hImpersonationToken);
        if (bRet == false)
        {
            printf(" WTSQueryUserToken ERROR: %d\n", GetLastError());
        }
        printf("hImpersonationToken=====%d\n", hImpersonationToken);

        //Get real token from impersonation token
        DWORD neededSize1 = ;
        HANDLE *realToken = new HANDLE;
        //TOKEN_USER tkUser;
        TOKEN_USER *pTokenUser = NULL;
        PTOKEN_GROUPS pGroups = NULL;
        //if (GetTokenInformation(hImpersonationToken, TokenGroups, NULL, neededSize1, &neededSize1))
        , &neededSize1))
        //if (GetTokenInformation(hImpersonationToken, TokenUser, &tkUser, sizeof(tkUser), &neededSize1))
        //if (GetTokenInformation(hImpersonationToken, (::TOKEN_INFORMATION_CLASS) TokenLinkedToken, realToken, sizeof(HANDLE), &neededSize1))
        {
            CloseHandle(hImpersonationToken);
            hImpersonationToken = pTokenUser;
        }
        else
        {
            printf(" neededSize1: %d\n", neededSize1);
            )
            {
                printf(" ERROR_INSUFFICIENT_BUFFER.\n");
                //pGroups = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(), 0, neededSize1);
                pTokenUser = (TOKEN_USER*)new BYTE[neededSize1];
                printf("pTokenUser=====%d\n", pTokenUser);
                if (!GetTokenInformation(hImpersonationToken, TokenUser, pTokenUser, neededSize1, &neededSize1))
                //if (!GetTokenInformation(hImpersonationToken, TokenGroups, pGroups, neededSize1, &neededSize1))
                {
                    HeapFree(GetProcessHeap(), , pTokenUser);
                    pTokenUser = NULL;
                }

            }
            printf(" pTokenUser: %d\n", pTokenUser);
            continue;
        }
        printf("hImpersonationToken=====%d\n", hImpersonationToken);

    }

}

void Usage(void)
{
    fprintf(stderr,"==============================\n"
            "\tname:run programe at any session ,need system permission\n"
            "\tsession 1 D:\\callsession\\bin\\callsession.exe \n"
            "==================================\n");
}

int main(int argc, char **argv)
{
    ImpersonateActiveUserAndRun();

    ;
}

测试出来了第一版代码--可以得到用户token啦的更多相关文章

  1. 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

    以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...

  2. Rails 5 Test Prescriptions 最后一章,如何测试继承下来的代码,legacy code

    Set expectations 你不可能把一个老旧的代码野兽只用一晚就转变成优雅的奇迹marvel.你需要如下做法: 让自己有好的状态,用15分钟挥舞拳头诅咒之前的程序员 开始工作,这个codeba ...

  3. Java 银联支付官网demo测试及项目整合代码

    注:原文来源与 < Java 银联支付官网demo测试及项目整合代码  > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...

  4. 为使用mock方案测试,而重构代码的小小案例

    import com.sun.deploy.config.DefaultConfig; import javax.security.auth.login.Configuration; import j ...

  5. 关于idea跳过错误编译的理解, 跳过报错的代码启动项目去debug测试其他正常的代码

    关于idea跳过错误编译的理解 2018年07月13日 19:06:32 weixin_39669410 阅读数 1296   其实idea使用eclipse编译器可以实现跳过报错的代码启动项目去de ...

  6. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-9.使用JWT生成用户Token回写客户端

    笔记 9.使用JWT生成用户Token回写客户端     简介:讲解用户授权登录后,需要生成登录凭证重定向到页面上 1.获取当前页面访问地址 2.根据User基本信息生成token 3.重定向到指定页 ...

  7. 融云SDK:获取用户Token的方法

    融云SDK查看ServerAPI里面有个获取Token的方法,本以为只要传三个参数就可以.后来发现,在请求头有几个必须要传的参数,否则服务器返回401(未授权).拿获取Token接口为例子 如图所示, ...

  8. Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...

  9. web首页设置如下代码可判断用户是用什么设备登录的?

    var OnePage=true;//用来判断staticHtml.js中首页登入的信息判断var _mobileUrl = "http://a.abc.com";//手机用户通过 ...

随机推荐

  1. 回调函数,回调函数使用call

    回调函数:一个函数b作为参数,给另外一个函数a使用.并且在执行a之后(注意不一定是执行完a),再去执行b这个函数. 上代码: function a(callback) { alert("我是 ...

  2. [转]iOS WebKit browsers and auto-zooming form controls

    问题描述:https://github.com/jquery/jquery-mobile/issues/2581 本文转自:http://www.456bereastreet.com/archive/ ...

  3. c# Queue实现生产者(Producer)消费者(Consumer)模式

    我们在开发过程中经常会遇到需要从一个地方不断获取数据然后又需要交给另一个线程对数据进行二次加工的情况,这种场景适合使用生产者-消费者模式. Demo展示 //中间的容器 public static c ...

  4. python自动化--语言基础五面向对象、迭代器、range和切片的区分

    面向对象 一.面向对象简单介绍: class Test(): #类的定义 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 def __ini ...

  5. NoSQL与关系数据库

    关系型数据库:完全支持关系代数理论作为基础:有较大的数据规模:固定的数据库模式:查询效率快:强一致性:数据完整性较易实现:扩展性一般:可用性好. NoSQL:部分支持关系代数理论作为基础:有超大数据规 ...

  6. Angular——自定义过滤器

    基本介绍 除了使用AngularJS内建过滤器外,还可以根业务需要自定义过滤器,通过模块对象实例提供的filter方法自定义过滤器. 基本使用 (1)input是将绑定的数据以参数的形式传入 (2)i ...

  7. parsley之验证属性设置

    parsley.js添加表单验证功能,直接在html元素中添加对应属性: Name API Description Required #2.0必填 required HTML5 data-parsle ...

  8. swift- mutating

    struct Stack<Element> { var items = [Element]() func push(_ item:Element){ self.items.append(i ...

  9. Java基础概念语法

    Java基础概念语法 注释 单行注释 //行注释说明 多行注释 /* 多行注释说明 */ 文档注释 /** *@author 程序的作者 *@version 源文件的版本 *@param 方法的参数说 ...

  10. ionic3视频播放功能

    因为项目的需要,需要使用视频播放的功能,使用的是videogular2插件,但是报了一个无法识别video-player 这个标签,百度了很多,发现原来是版本 不对,ionic3是以来angular5 ...