测试出来了第一版代码--可以得到用户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";//手机用户通过 ...
随机推荐
- javascript检测基本类型值或引用类型值的类型方法
首先javascript的数据类型分为两种数据类型:基本数据数据类型和引用数据类型 基本数据类型:Number,String,Boolean,Undefined,Null.原始值,是简单的数据段,可按 ...
- E1963A/E6703B W-CDMA Online User's Guide
官网资料地址: http://rfmw.em.keysight.com/rfcomms/refdocs/wcdma/
- Windows 2008中部署dll到GAC
两种方法: 1 gacutil.exe 2 直接拖动DLL到GAC (此种方式要关闭UAC,否则提示"Access is Denied")
- 4星|《DK商业百科》:主要商业思想与事件的概括
全书分为以下6章:1:企业的起步与发展:2:领导和人力资源:3:理财:4:战略和运营:5:营销管理:6:生产与生产后.每章有拆分为成多个比较小的专题,阐述相关专题的主要的商业思想与实践. 基本是作者按 ...
- linux使用crontab实现PHP执行计划定时任务
linux使用crontab实现PHP执行计划定时任务 前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理 首先说说cron,它是一个l ...
- Jenkins系列之Jenkins的工具配置和插件(二)
上一篇我们介绍了Jenkins的安装,这一篇我们介绍如何配置Jenkins的工具和如何下载插件. 首先我们先来看如何配置工具,这里的工具是指JDK.Ant.Maven.Git等. 一.如图,点击系统管 ...
- Xamarin.Forms android实现沉浸式
在android项目里,这样设置 using System; using Android.App; using Android.Content.PM; using Android.Runtime; u ...
- Pytorch 加载保存模型【直播】2019 年县域农业大脑AI挑战赛---(三)保存结果
在模型训练结束,结束后,通常是一个分割模型,输入 1024x1024 输出 4x1024x1024. 一种方法就是将整个图切块,然后每张预测,但是有个不好处就是可能在边界处断续. 由于这种切块再预测很 ...
- nginx配置X-Forwarded-For 防止伪造ip
网上常见nginx配置ip请求头 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 风险: 用于可以通过自己设置请求头来伪造ip ...
- @ExceptionHandler和@ControllerAdvice统一处理异常
//@ExceptionHandler和@ControllerAdvice统一处理异常//统一处理异常的controller需要放在和普通controller同级的包下,或者在ComponentSca ...