测试出来了第一版代码--可以得到用户token啦
一版一版往前走啦。。。
先安装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啦的更多相关文章
- 使用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 ...
- Rails 5 Test Prescriptions 最后一章,如何测试继承下来的代码,legacy code
Set expectations 你不可能把一个老旧的代码野兽只用一晚就转变成优雅的奇迹marvel.你需要如下做法: 让自己有好的状态,用15分钟挥舞拳头诅咒之前的程序员 开始工作,这个codeba ...
- Java 银联支付官网demo测试及项目整合代码
注:原文来源与 < Java 银联支付官网demo测试及项目整合代码 > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...
- 为使用mock方案测试,而重构代码的小小案例
import com.sun.deploy.config.DefaultConfig; import javax.security.auth.login.Configuration; import j ...
- 关于idea跳过错误编译的理解, 跳过报错的代码启动项目去debug测试其他正常的代码
关于idea跳过错误编译的理解 2018年07月13日 19:06:32 weixin_39669410 阅读数 1296 其实idea使用eclipse编译器可以实现跳过报错的代码启动项目去de ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-9.使用JWT生成用户Token回写客户端
笔记 9.使用JWT生成用户Token回写客户端 简介:讲解用户授权登录后,需要生成登录凭证重定向到页面上 1.获取当前页面访问地址 2.根据User基本信息生成token 3.重定向到指定页 ...
- 融云SDK:获取用户Token的方法
融云SDK查看ServerAPI里面有个获取Token的方法,本以为只要传三个参数就可以.后来发现,在请求头有几个必须要传的参数,否则服务器返回401(未授权).拿获取Token接口为例子 如图所示, ...
- Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...
- web首页设置如下代码可判断用户是用什么设备登录的?
var OnePage=true;//用来判断staticHtml.js中首页登入的信息判断var _mobileUrl = "http://a.abc.com";//手机用户通过 ...
随机推荐
- php 文件上传限制修改
修改PHP上传文件大小限制的方法 1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止 ...
- Maven之项目搭建与第一个helloworld(多图)
这次记录第一个搭建一个maven的helloworld的过程. 转载 1.搭建web工程肯定得new 一个 maven工程,假如project中没有直接看到maven工程,那么选择Other,然后在W ...
- vue+elementUI table篇
1.table内容展示 <el-table stripe :key='tableKey' header-cell-class-name="bindonce" :data=&q ...
- 实例化WebService实例对象时出现localhost未引用命名空间
//实例化WebService实例对象 localhost.WebService WebserviceInstance = new localhost.WebService(); 在实例化WebSer ...
- Java编程思想读书笔记_第7章
final关键字类似const: import java.util.*; public class FinalData { static Random rand = new Random(47); f ...
- 解决Unicode编码(璘)
随着互联网发展,B/S越来越受欢迎 Code编码格式也越来载多, 在大千花花世界 中文在Web显示看似一样但实际编码并不样,导致从页面获取的资料录入到数据库中时 存取的就是Code编码 如:Unico ...
- ValueError: multi-byte encodings are not supported
pyton解析xml时,报错 是因为编码的问题,把xml的头 <?xml version="1.0" encoding="gb2312"?> 改成 ...
- python 模块-easygui.buttonbox
2018-03-0315:43:11 ): Yes_or_No = easygui.buttonbox("是否良品?", choices=['Yes', 'No', '退出']) ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
- Quartus 12的TimeQuest Timing Analyzer
Quartus 12的TimeQuest Timing Analyzer 1.在Quartus II软件打开和设置设计 安装路径下\qdesigns\fir_fliter文件.在Processing ...