alpha版出炉,实现win2008 service的session 0穿透

指定用户名,拿最小session,实现和用户ui交互。

这样,搞windows的自动化部署,就可以向前一大步啦。

比以前用psexec要用户名密码,指定session要先进多啦。

安全保密性也提高了。。

#include <windows.h>
#include <stdio.h>
#include <Userenv.h>
#include <Wtsapi32.h>
#pragma comment(lib, "WtsApi32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "userenv.lib")
using namespace std;

HANDLE GetUserToken(DWORD dwSessionId)
{
    HANDLE hImpersonationToken = 0;
    if (!WTSQueryUserToken(dwSessionId, &hImpersonationToken))
    {
        printf(" WTSQueryUserToken ERROR: %d\n", GetLastError());
        return FALSE;
    }
    DWORD dwNeededSize = 0;
    HANDLE *realToken = new HANDLE;
    TOKEN_USER *pTokenUser = NULL;
    PTOKEN_GROUPS pGroups = NULL;
    //twice call function
    if (!GetTokenInformation(hImpersonationToken, TokenUser, NULL, 0, &dwNeededSize))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && dwNeededSize > 0)
        {
            pTokenUser = (TOKEN_USER*)new BYTE[dwNeededSize];
            if (!GetTokenInformation(hImpersonationToken, TokenUser, pTokenUser, dwNeededSize, &dwNeededSize))
            {
                printf("GetTokenInformation ERROR: %d", GetLastError());
            }
        }
        return hImpersonationToken;
    }
    return hImpersonationToken;
}

bool GetSessionUserName(DWORD dwSessionId, char username[256])
{
    LPTSTR pBuffer = NULL;
    DWORD dwBufferLen;
    if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, dwSessionId, WTSUserName, &pBuffer, &dwBufferLen))
    {
        printf(" WTSQuerySessionInformation ERROR: %d\n", GetLastError());
        return FALSE;
    }
    lstrcpy(username ,pBuffer);
    WTSFreeMemory(pBuffer);
    return TRUE;
}

void Usage(void)
{
    printf("==============Usage================\n"
            "path:\\callsession.exe 'system-admin' 'path:\\xxx.exe start'\n"
            "==============Usage================\n");
}

int main(int argc, char **argv)
{
    if(argc==1)
    {
        Usage();
        return FALSE;
    }
    else if(argc==3)
    {
        LPSTR lpUsername = argv[1];
        LPSTR lpCmdLine = argv[2];
        DWORD session_id = -1;
        DWORD session_count = 0;
        WTS_SESSION_INFOA *pSession = NULL;
        char username[256];
        BOOL blFound = FALSE;
        //EnumerateSessions
        if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSession, &session_count))
        {
            printf("WTSEnumerateSessions ERROR: %d", GetLastError());
            return FALSE;
        }
        //Get the right user and his session id
        for(DWORD i = 0; i < session_count; ++i)
        {
            GetSessionUserName(pSession[i].SessionId,username);
            //if( (pSession[i].State == WTSActive) && (pSession[i].State != WTSDisconnected) )
            if(!strcmp(lpUsername, username))
            {
                printf("\tSession user's name = %s\n",username);
                session_id = pSession[i].SessionId;
                printf("\tsession_id = %d\n",session_id);
                blFound = TRUE;
                break;
            }
        }
        if (!blFound){
            printf("No login username %s found.", lpUsername);
            return FALSE;
        }
        WTSFreeMemory(pSession); //free meme heap
        //Duplicate User Token
        HANDLE hTokenThis = GetUserToken(session_id);
        HANDLE hTokenDup = NULL;
        if (!DuplicateTokenEx(hTokenThis, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hTokenDup))
        {
            printf("DuplicateTokenEx ERROR: %d\n", GetLastError());
            return FALSE;
        }
        if (!SetTokenInformation(hTokenDup, TokenSessionId, &session_id, sizeof(DWORD)))
        {
             printf("SetTokenInformation Error === %d\n",GetLastError());
             return FALSE;
        }
        //init this process info
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(STARTUPINFO));
        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
        si.cb = sizeof(STARTUPINFO);
        si.lpDesktop = "WinSta0\\Default";
        //LPVOID pEnv = NULL;
        DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
        //CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);
        if (!CreateProcessAsUser(hTokenDup, NULL, lpCmdLine, NULL, NULL, FALSE, dwCreationFlag, NULL, NULL, &si, &pi))
        {
            printf("CreateProcessAsUser Error === %d\n",GetLastError());
            return FALSE;
        }
        printf("OK");
    }

    return 0;
}

  

时间: 2024-09-11 15:39:46

alpha版出炉,实现win2008 service的session 0穿透的相关文章

加入DOTA元素 《全面战争》网游版出炉

第1页加入DOTA元素 <全面战争>网游版出炉 <全面战争:竞技场> 天极游戏讯 欧美知名游戏开发商http://www.aliyun.com/zixun/aggregation/16466.html">Creative Assembly今日在GDC大会上宣布了一款全新的作品<全面战争:竞技场>,据他们表示,这是一款免费在线游戏,游戏中还融入了RTS元素和DOTA元素,玩家将可以操纵史上最伟大的指挥官以及他们的军队互相交锋. 据制作人Russell透露,

火车头采集器炎黄网络特别版出炉

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 火车采集器(Locoy.com)是一个功能强大的数据采集软件.使用它,您可以很容易的从网页上抓取文字,图片,文件等资源.程序支持远程下载图片文件,支持网站登陆后信息采集,支持探测文件真实地址,支持代理,支持防盗链的采集,支持采集数据直接入库和模仿人手工发布等.同时,软件具有极高的稳定性,可以多线程,多任务的工作,您可以用它进行大批量数据的更新

PHP5正式版出炉

php5 Some of the key features of PHP 5 include: The Zend Engine II with a new object model and dozens of new features. XML support has been completely redone in PHP 5, all extensions are now focused around the excellent libxml2 library (http://www.xm

陈乔恩版东方不败出炉 全方位对比各版教主

制作人于正改编的金庸名著<笑傲江湖>电视剧终于在千呼万唤中揭开神秘面纱.陈乔恩版东方不败定妆照终于出炉!看到照片瞬间,仿佛一记惊雷从头上呼啸而过,这是东方小妹还是东方教主?下面就让小编带你来全方位对比下曾经饰演过东方不败的各位明星,看看究竟谁才是你心中完美的教主.(来源:贴吧) 小说人物描述: 东方不败,金庸小说<笑傲江湖>中的日月神教教主,武功无敌江湖.他在任我行掌教期间任副教主,后趁任我行练功走火入魔之际发动叛乱,囚禁任我行,并用计谋掌控神教,成就枭雄霸业.他在位期间习<

Ubuntu 10.04 LTS的RC候选版如期出炉

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   虽然最后时刻出现了严重的内存泄露问题,但Ubuntu 10.04 LTS的RC候选版今天还是如期出炉了.此次发布的RC候选版包括桌面版.服务器版.上网本版和企业云计算与亚马逊EC2服务器版,已经基本完整.稳定,适合广泛体验,同时Kubuntu.Xubuntu.Edubuntu.Ubuntu Studio.Mythbuntu等各种衍生版本也进入了Beta测试状态.

传电信版iPhone 4S合约出炉 最低月租仅为49元

C114讯 1月31日下午消息(孙剑)据消息人士透露,电信版iPhone 4S合约已经出炉,两年合约计划最低月租仅为49元.而据电信 客服人员表示,由于电信版iPhone 4S尚未开售,最终的合约计划仍未确定.据了解,如该消息属实,电信版iPhone 4S的补贴力度将超过中国联通,或将对联通版iPhone 4S的销售带来冲击.电信版iPhone 4S 16G合约计划联通版iPhone 4S 16G合约计划

北京电信商用版3G无线宽带套餐资费正式出炉

3月29日消息,中国电信北京公司(以下简称北京电信)宣布,将于4月1日起推出商用版3G无线宽带套餐,该套餐分为100元全国.150元本地.200元全国.200元本地.300元全国共计五档,目前该套餐的资费已经出炉,新老用户可根据自身需求于4月1日起开始办理. 北京电信表示,3G无线宽带产品经过一年的试商用逐步趋于成熟,新套餐的推出符合目前北京3G无线宽带市场的主流水平,体系也更为丰富和完善,能有效满足各类人群的不同需求.同时,所有套餐统一采取时长.流量双重计费标准,即套餐内除包含一定的使用时长外

微软Silverlight 3正式版已经出炉

微软Silverlight 3正式版已经出炉     再过几个小时微软才会官方发布,但Silverlight 3正式版(版本号3.0.40624.0)已经新鲜出炉了.如果你感兴趣可以前往其官方网站升级安装.   对普通用户来说,Silverlight(WPF/E)是微软的一个跨平台.跨浏览器插件,用于提供新一代Web媒体体验和丰富互联网应用(RIA),而对开发人员和设计师来说,Silverlight是个强大的Web程序开发平台,外加媒体和动画功能.它从一开始就肩负着挑战Adobe Flash统治

虚拟FX特效工作室出炉真人游戏版FPS枪战特效片

虚拟FX特效工作室Corridor Digital又有新作品问世了,此次他们创作的新影片将真实世界中的FPS枪战与虚拟的游戏环境完美结合在了一起. 真人游戏版FPS枪战特效片出炉 在视频中玩家可以看到真人演员被射杀后变为了游戏世界中的掉落道具,同时真人演员还拥有诸如穿墙能力等游戏中才会有的BUG现象. (挖贝网)