模拟用户登录(张佩)

System权限下进程遇到的问题以及如何降权启动进程 一. 背景最近项目上踩到一个坑,即偶现升级过程中通过计划任务调起新安装包,程序安装到了错误的地方,并且桌面快捷方式等入口均没有生成,总而言之就是一个“自杀”行为。二. 原因通过测试发现原因:在有些情况下,通过计划任务(通过服务也是如此)调起的进程是system权限的。而在system权限下进程可能会遇到很多问题: 通过注册表或expand 环境变量等方法得到的系统目录并不是我们想要的,例如 阅读详情

我不知道这能不能算一个好点子,但我觉得这真的不错:模拟一个权力更大的用户进行某些无法完成的操作。
举个例子来说:你在Administrator用户下,打开文件1.exe的安全设置页面,添加并设置Guest用户的权限为file control拒否,如下图所示:
 
这样,按照正常的办法,Guest用户将访问不到1.exe文件了。但是一点其他的办法都没有吗?也不是的,我告诉你一个:模拟高权用户!
这是一个很别扭的例子,是我为了说明问题而“多此一举”。但有的时候,你可能要在用户 每次登进系统的时候,修改某些系统设置。要完成这些设置,也许需要一定的用户权限,而像guest这样的低权限用户可能就完成不了。如果这样的话,你将会 对这些用户失去控制。这时你可能就要用到这里的方法了。
我下面的例子,仍然只以1.exe的访问来说明问题。读者看了我上面写的内容后,自然能够举一反三的吧。
        HANDLE hToken ;
        DWORD dwError ;
        STARTUPINFOW    si ;  
        PROCESS_INFORMATION  pi ;  
 
        ZeroMemory (&si , sizeof (si ));
        ZeroMemory (&pi , sizeof (pi ));
        si .cb = sizeof (si );
 
        if (0 == LogonUser (" administ ", ".", " password ", LOGON32_LOGON_INTERACTIVE , LOGON32_PROVIDER_DEFAULT , &hToken ))
        {
                printf ("Failed to call LogonUser/r/n");
                dwError = GetLastError ();
        }
        else
        {
                if( CreateProcessAsUserW (hToken , L "c:// 1. exe", NULL ,
                        NULL , NULL ,
                        FALSE , NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE ,
                        NULL , NULL , &si , &pi ) )
                {
printf ("Success! Call CreateProcessAsUserW/r/n");
}
        }
代码很简单,就是正确使用LogonUser和 CreateProcessAsUser这两个API。我再简单地说一下,LogonUser的目的是取得一个指定用户的令牌Token,令牌代表了用户 所拥有的权限。CreateProcessAsUser里面利用了这个令牌创建进程。
如果你不是创建进程怎么办呢?比如你只是要打开一个1.txt文档对它进行读写操作。看如下代码:
 
bRet = ImpersonateLoggedOnUser (hToken );
                if (bRet == FALSE )
                        return 1;
 
                FILE * hFile = fopen ("c:// 1 .txt", "r");
 
            RevertToSelf ();
 
    什么意思?ImpersonateLoggedOnUser的作用是让当前进程模拟一个用户,直到RevertToSelf被调用。所以,fopen是以Administrator的权限调用的,hFile将返回一个正确的值。
    甚至还有另外的一种方法,它可以避免用LogonUser取得一个用户Token。因为这个API必须要调用者提供用户名和密码的参数,可移植性太差了。如果知道一个进程,而此进程总是以很高的用户权限运行的话,只要取得这个进程的Token就可以了。
    现在正好有这样一个进程,它就是winlogon.exe。我把代码放到下面(这段代码的作者是jiurl):
   
        pid = FindWinlogon (); // 取得 winlogon.exe 的进程 ID
        if ( pid <0 )
        {
                return 0;
        }
 
        hProcess = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , pid );
        if ( hProcess ==NULL )
        {
                return 0;
        }
 
        rc = OpenProcessToken ( hProcess , TOKEN_ALL_ACCESS , &hOldToken );
        if ( rc ==0 )
        {
                CloseHandle (hProcess );
                return 0;
        }
 
        rc = DuplicateTokenEx (hOldToken , NULL , NULL , SecurityIdentification , TokenPrimary , &hNewToken );
        if ( rc ==0 )
        {
                CloseHandle (hProcess );
                CloseHandle (hOldToken );
                //printf("DuplicateTokenEx Error: %d/n", GetLastError());
                return 0;
        }
    最后得到的 hNewToken就是我们要找的Token,接下来你就可以用它来调用CreateProcessAsUser或者 ImpersonateLoggedOnUser了。一般来说,上面的代码需要在服务里面运行,否则可能会因为权限不够,导致OpenProcess和 OpenProcessToken调用失败。服务是system权限,权限足够。
转自:http://blog.chinaunix.net/u/21790/showart_484973.html
VC使用logoUser 与CreateProcessAsUser指定用户运行程序例子 VC使用logoUser 与CreateProcessAsUser指定用户运行程序例子 名家作品。收藏一下。 VC实现runas的功能。 立即下载

相关推荐

易语言其他用户令牌执行

易语言其他用户令牌执行源码,其他用户令牌执行,取最近执行程序路径,LogonUser,ImpersonateLoggedOnUser,GetLastError,RevertToSelf

临时以其它登录用户来执行操作

有时我们需要临时以其它用户的权限来执行某项操作。典型的像从一个共享文件夹中复制数据到本地,如果这个共享文件夹处于一个安全的服务器上,且设置了只有指定的用户才能读取,这时这种技术就非常有用;通常的处理方法是临时映射一个本地盘符,用完后取消映射,但如果要处理的时间稍长,有经验的用户会察觉到它,并在你的程序执行操作的同时也同样可以访问到其中的敏感内容,所以我们需要秘密的访问它。Windows 有几个 A

都市夜猫的专栏 1372

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7294

服务中读取当前用户注册表HKEY_CURRENT_USER

服务中读取当前用户注册表HKEY_CURRENT_USER 原文地址:http://hi.baidu.com/solohac/item/dfc68f5301fedb918c12ed4b tag: 服务 HKEY_CURRENT_USER HKEY_USER 读取 RegQueryValueEx 注册表   我在服务程序中使用RegQueryValueEx读取注册表HKEY_CURREN

ly402609921的专栏 8134

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 438

Jenkins离线安装保姆级教程:从下载.war包到SVN+Maven项目一键部署(附避坑脚本)

本文详细介绍了Jenkins离线安装的全流程,包括.war包下载、SVN+Maven项目配置及自动化部署。特别针对内网环境提供解决方案,涵盖插件管理、开发工具链配置、构建触发器和SSH部署等关键步骤,帮助企业在网络隔离环境下实现高效持续集成。

weixin_30096975的博客 374

工作中遇到疑问验证

1、注册表PendingFileRenameOperations键值,位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,类型REG_MULTI_SZ(多字符串),具体说明如下截图: 2、BSOD,全称Blue Screen of Death,蓝屏死机,具体实现如下图: 原文地址:https://...

yellow的博客 645

8位2路选择器设计

8位2路选择器设计

好好学习,天天向上 4286

windows系统的安全性基础 -- 访问控制

最近看了一下msdn上关于windows的访问控制模型。访问控制就是“适当人使用适当的资源right persons use right resources.” 所以, 第一步,操作系统要认证Authentication, 验证是否是用户声明的用户身份。验证通过,以后, 第二步,操作系统要授权Authorization,   用户a要读取一个文件,操作系统检查文件的安全描述符secu

开心乐源的专栏 2935

AI产品经理面试宝典第9天:关于AI产品经理的挑战与转型怎么回答

AI技术重构产品逻辑,AI产品经理需直面三大核心命题:用户定位差异、技术融合边界、商业价值转化。本文从千道真题中提炼出面试高频考点,剖析AI产品经理如何突破传统思维定式,在B端需求与C端体验间构建价值桥梁,用数据驱动产品创新,破解技术落地的隐性壁垒。掌握这三重跃迁法则,助你在AI浪潮中脱颖而出。

打造全国最全的AI Agent开发知识领域的博客 175

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2843

模拟用户登录

模拟用户登录 --张佩 1. 用户模拟 如果将文件test.exe的安全属性设置成Guest用户无法访问的话,以Guest用户登录后,访问者就不能访问test.exe文件了。但有一个办法可以让访问者在使用Guest账户登录的情况下也能够访问此文件,就是使用用户模拟的方式,暂时以高权用户的身分访问这个文件!下面的代码实现了用户模拟: HANDLEhToken;

张佩的技术库 3878

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872

模拟Windows登录用户进行特殊操作

SYSTEM权限(服务启动程序)下如何读写当前登录用户相关的数据(桌面、开始菜单、注册表等等)?管理员权限如何提升到SYSTEM权限进行一些特殊的操作(一些关键的注册表位置、创建一个SYSTEM权限的进程等等)?一个非常关键的API就是ImpersonateLoggedOnUser,可以让当前线程模拟登陆用户进行操作(当然还可以从管理员模拟SYSTEM权限),用完之后记得调用RevertToSel

codemanrock 1800

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Windows:服务程序用当前登录用户来执行函数

为什么80%的码农都做不了架构师?>>> ...

weixin_33972649的博客 697

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JJY本地服务器以服务方式运行不能读取消息文件

1.问题描述 JJY主服务器采用Windows服务方式运行时,在读tb_0031消息对应的外部文件时失败.而在控制台方式下正常。 读文件失败的结果是单据没有发送,且错误类型是文件路径不存在(ERROR_PATH_NOT_FOUND).在程序采用忽略该消息记录并删除的逻辑控制下,系统表现出DRP系统的数据已抽取(tb_)但没有发送出去,并且在tb_0031没有痕迹。 这些文件是由DD抽取服

wherwh的专栏 962

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

在windows平台搭建一个mini版本的k8s集群

因此,它天然拥有创建令牌的权力。官方描述是“调试程序”,但实际上它允许持有者打开任何进程的句柄,拥有 PROCESS_ALL_ACCESS 权限,即使该进程属于 SYSTEM 或其他用户。当你登录系统时,无论是交互式登录、服务启动,还是计划任务触发,LSASS 都会负责认证你的身份,并为你生成一个访问令牌。

OsyN6aMZ6的博客 483

C# 访问共享文件夹或者磁盘(需要用户名密码)

C# 访问共享文件夹或者磁盘(需要用户名密码) 边界流浪者 SharedTool: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication5 { ...

cxu123321的博客 5125

[轉載]Run As Administrator

[本文轉自博客堂]在Windows Vista运行Visual Studio 2005(without SP1)时,最好使用Vista的Run as administrator的功能,否则有些功能就不能正常工作。而在我们开发的.NET程序内部,有时也会碰到需要临时提高权限的情形。ASP.NET程序员经常问的一个问题是,我的代码为什么没有权限创建一个文件?基本的解决方案有三个: 提升A...

weixin_30279751的博客 436

c#访问其他服务器的共享文件夹,C#如何访问共享文件夹或者磁盘

本文实例为大家分享了C#访问共享文件夹或者磁盘的具体代码,供大家参考,具体内容如下SharedTool:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace ConsoleApplication5...

weixin_39664560的博客 2051

紧急!C#多平台权限失控风险预警,速看这套统一治理方案

解决C#跨平台权限管理难题,实现安全可控的统一治理。针对多平台应用开发中的权限分散问题,通过C# 跨平台 权限统一管理方案,集成角色策略与动态授权,提升安全性与维护效率,适用于Windows、Linux及移动端场景,值得收藏

PixelIsle的博客 586

【案例 5-3】 模拟用户登录

1.任务描述在使用一些 APP 时,通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功,否则会提示用户名或密码错误。本例要求编写一个程序,模拟用户登录。程序要求如下:(1) 用户名和密码正确,提示登录成功。(2) 用户名或密码不正确,提示“用户名或密码错误”。(3) 总共有 3 次登录机会,在 3 次内(包含三次)输入正确的用户名和密码后给出登录成功的相应提示。超过 3 次用户名或密码输入有误,则提示登录失败,无法再继续登录。

菜鸟一枚。 2525
上一篇: 激活后台运行程序的窗口
下一篇: 进程的结束和UAC的权限提升
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值