Windows 7开发:UAC数据重定向 - Win32 Native
Windows 7开发:UAC数据重定向 - Win32 Native
目标
本动手实验中,您将会学习如何:
• 故障排除一个文件重定向 问题
• 使用Process Monitor查找引起问题的根本原因
系统要求
您必须符合下面的条件以完成这次实验:
• Microsoft Visual Studio 2008
• Microsoft Windows 7
• Windows 7 SDK
• Microsoft TechNet上的Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx )
练习: 体验用户帐户控制虚拟化
在这个练习中,您将会诊断一 个损坏的本机的 (Win32) C++ 应用程序显示了文件重定向到VirtualStore文件夹。
随后您将会添加一个UAC清单文件并编译应用程序,从而使它支持UAC。您将会注意到它并没 有被重定向,而是当对Program Files文件进行写入操作时将会被阻止并引起“拒绝访 问”错误。
最后,您将对应用程序进行修改,即将文件存储到应用程序数据 (ProgramData)文件夹,来解决这一问题。
任务1 – 无清单文件情况下,运 行应用程序
在这个任务中,您将会在没有清单文件的情况下运行应用程序,以模仿一 个旧应用程序并触发UAC虚拟化引擎。在Visual Studio 2008中创建一个新应用程序的时候, 还会默认自动嵌入一个包括UAC节点的清单文件。
1.确保您的动手实验运行在一个支 持UAC的系统上:
a.在开始菜单中
i.打开搜索
ii.输入 UAC
iii.在搜索列表中点击“改变用户帐户控制设置”
b.用户帐户控制设 置对话框出现了。确定UAC没有被禁用。
i.设置UAC滑块处于默认位置(见下图)
ii.点击 OK
2.转到 包含DataRedirection解决方案的文件夹
3.在Visual Studio中打开该解决方案
a.确定您没有使用管理员权限运行Visual Studio
b.如果Visual Studio是以 管理员权限运行的,那么标题栏上会显示“Visual Studio (Administrator) ”
4.将BrokenAppNative项目设置为开始项目:
a.右键点击解决方案窗 口中的项目并选择设为启动项目
5.设置生成目标为x86 (Debug or Release; Debug recommended):
帮助
这样做的原因是对x64应用程序而言,不论有没有清单文件虚拟化都是关闭的。
6.右键点击解决方案窗口中的BrokenAppNative项目并选择属性:
a.默认的, Visual Studio 2008会在UAC的一个节点中对项目进行配置;我们将会关闭这一设置以表明一 个滞后的应用程序是如何运行的。
7.在属性中:
a.展开配置属性
b.展开Linker
c.选择清单文件
d.改变启用用户帐户控制(UAC)选择为No
e.点击 OK
8.转到BrokenAppNative.cpp文件并查看SaveFile和LoadFile 方法
9.请注意在 MakeDataFilePath 中路径是如何生成的:
a.数据文件路径保存在Program Files文件 夹下
b.SHGetKnownFolderPath的FOLDERID_ProgramFiles参数获得 Program Files 文 件夹的路径
c.如果没有子文件夹的话,首先会在Program Files 下创建一个子文件夹
d.然后会在该子文件夹下创建一个文件(SomeFile.txt)
10.生成项目并运行 。请再一次确定您没有以管理员的身份运行。
11.打开任务管理器并点击进程选项卡 。
a.在View的菜单中,选择Select Columns
b.弹出Select Process Page Columns对话框
c.选中复选框中的User Account Control (UAC) Virtualization,如 下图中红框所示(确定您选中了那个选项)
d.点击 OK
12.注意 UAC虚拟化列,确定您的进程为启用状态:
13.在编 辑框中输入些内容然后保存。这个操作应该成功;也就是说不会得到一个错误。
14.试着 转到路径所指向的地方(例如,64位Windows 7中的 C:\Program Files (x86)\BrokenApp 或 者86位Windows上的 C:\Program Files\BrokenApp)
注意
您在Program Files 中肯定找不到BrokenApp,因为写入文件的操作会被重定向到 VirtualStore 文件夹。
任务2 – 找出问题
在这个任务中,您将会通过不同的步骤来确定您的 应用程序正在应用UAC虚拟化。
1.从Microsoft TechNet 网站下载并解压进程管理器 (Process Monitor) (http://technet.microsoft.com/en- us/sysinternals/bb896645.aspx ).
2.启动进程管理器
3.启动 BrokenAppNative应用程序
4.点击第三个工具栏按钮确定进程管理器正在进行捕获。 您也可以通过按CTRL-E 来开启/关闭捕获。
5.在 BrokenAppNative应用程序中,在文本框中输入一些文本。
6.���BrokenAppNative应用程序中点击保存。
7.您可 以通过点击进程管理器的工具栏中的第三个按钮停止捕获(或按CTRL-E)。
8.在进程 管理器中,在工具菜单中,点击进程树。进程树对话框将会弹出,如下所示:
9.在树中 找到BrokenAppNative.exe并双击。
10.点击关闭以关闭进程树对话框。
11.在 进程管理器中右键点击BrokenAppNative进程名
12.点击包含BrokenAppNative。这将 会筛选出其他所有事件:
帮助
您能看见BrokenAppNative试图创建C:\ProgramFiles (x86) \BrokenApp\SomeFile.txt文件。这个文件被重定向到了VirtualStore文件夹,这也是数据文 件最终的存放的地方。
注意结果列。 “REPARSE”行就是最原始的操作。 “SUCCESS”行就是重定向操作。
任务3 – 添加一个UAC 清单文件
在这个任务中,您将会添加一个清单文件来使应用程序支持UAC。标记您的应用程序 为支持UAC的应用程序,您要声明应用程序无需写入访问受保护的位置。UAC虚拟化将不会应 用到您的应用程序。
1.在项目窗口中右键点击BrokenAppNative项目并选择属性。
2.展开配置属性(Configuration Properties)。
3.展开Linker。
4. 选择清单文件。
5.改变启用用户帐户控制(UAC)为Yes
6.点击 OK.
7.重新生成应用程序。
8.运行应用程序
9.查看任务管理器,您将会注意到 虚拟化现在被禁用了:
帮助
这是由于当前清单文件中的UAC节点将应用程序标记为了支持UAC。
10.在编辑框中输入一些文本并点击保存。您应该得到下面的错误:
帮助
由于UAC虚拟化被关闭了,所以写入受保护的位置时会收到错误。
任务 4 – 修改拒绝访问错误
通过在清单文件中包含UAC节点,您声明了在Windows 7中 您的应用程序支持UAC,因此可以阻止在受保护的地方进行写入操作。在这个任务中您将改变 文本文件的存储地点并修复拒绝访问错误。
1.回到Visual Studio
2.在 BrokenAppNative.cpp中找到MakeDataFilePath方法
3.注释掉方法顶部包含 FOLDERID_ProgramFiles的那行代码。
4.对包含FOLDERID_ProgramData的代码行取消 注释。
5.重新生成并运行应用程序。
您现在修复了重定向的问题并保存了您 的数据文件到正确的地方。
帮助
为了在Visual Studio 2008中实现重定向,您必须在清单文件中关闭UAC。要这么做 :
Visual Studio中的C#项目:
1.点击项目菜单
2.点击项目属性
3.在应用程序选项卡中,在资源选项卡中,选择图片和清单文件。
4.选择不 包含清单文件创建应用程序。
5.点击OK.
Visual Studio中的C++项 目:
1.点击项目菜单
2.点击项目属性
3.展开配置属性(Configuration Properties)
4.展开Linker.
5.选择清单文件。
5.改变启用用户帐户 控制(UAC)为No
6.点击 OK.
这里关闭UAC目的只是为了说明。所有可执行的 都应该包含在清单文件中的UAC节点中。如果清单文件包含了UAC节点,Windows将不会把应用 程序看做滞后的应用程序并且不会启用重定向。写入Program Files文件夹会引起拒绝访问错 误。
总结
在这个实验中您使用了进程管理工具来分析了一个UAC重定向的问题 ,并通过修改代码并保存文件到正确的位置(ProgramData)解决解决了它。
Windows 7开发:UAC数据重定向 - Win32 Native的更多相关文章
- Windows Phone开发(14):数据模板
原文:Windows Phone开发(14):数据模板 数据模板,如果你仅仅听到这个名词,你一定很迷惑,什么来的?用来干什么的?不急,亲,今天,我们一起来探索一下吧. 用白话文说,数据模板就是用来规范 ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...
- Windows App开发之文件与数据
读取文件和目录名 这一节開始我们将陆续看到Windows App是如何操作文件的. 在Windows上读取文件名称.目录名 首先我们在XAML中定义一个Button和TextBlock,将读取文件/目 ...
- Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
- C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍
因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...
- windows phone开发-Webbrowser使用技巧
原文:windows phone开发-Webbrowser使用技巧 5月份开发了脸萌WP版,其中需要使用web技术来绘制图像,于是就使用了原生webbrowser控件.在使用webbrowser co ...
- windows 驱动开发入门——驱动中的数据结构
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...
- Windows内核开发-9-32位和64位的区别
Windows内核开发-9-32位和64位的区别 32位的应用程序可以完美再64位的电脑上运行,而32位的内核驱动无法再64位的电脑上运行,或者64位的驱动无法在32位的应用程序上运行.这是为什么呢. ...
- Kinect for Windows SDK开发学习相关资源
Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...
随机推荐
- Codeforces 850C E. Arpa and a game with Mojtaba
对每个数统计其素数因子各次方数的数,然后通过y = (x>>i) | (x&((1<<(i-1))-1)) 模拟delete x and add to the lis ...
- CA、证书及openssl用法
CA和证书 摘要:涉及到网络安全这一块,想必大家都听过CA吧.像百度.淘宝.京东等这些知名网站,每年都要花费一笔money来买CA证书.但其实简单的企业内的CA认证,我们自己就可以实现,今天我就讲解一 ...
- 12_Azkaban案例实践5_Command操作Hive脚本任务
HIVE脚本任务 hadoop fs -mkdir -p /aztest/hiveinput hadoop fs -put az.data /aztest/hiveinput/ l 创建job描述文件 ...
- 【CPU】记录当前嵌入式设备CPU 比较最高CPU 并打印出来
1.测试CPU,最高CPU,最低CPU,平均CPU,单个进程如wlan的CPU占比,脚本后面接的第一个参数是要打印cpu的次数,第二个是sleep多久,第三个参数是记录当前数据的路径path #!/b ...
- js中的in
in这个操作符平时我们可能用的不多,但是一旦有需要我觉得还是很有用的,昨天在in操作符中栽了一个坑,写个博客纪念一下 var json = {a:1,b:2,c:3}; console.log('a' ...
- C#开发windows服务如何调试——资料整理
原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...
- 单元测试框架之unittest(七)
一.摘要 前篇文章已经详细介绍了unittest框架的特性,足以满足我们日常的测试工作,但那并不是unittest的全部,本片博文将介绍一些应该知道但未必能经常用到的内容 然而,想全部掌握unitte ...
- 分享一个我改进过的ocr算法
https://github.com/zhangbo2008/chineseOCR-jingjianban 欢迎大家前来拍砖
- Django框架下数据存储实现时间戳格式存储到数据库2019-12-11 17:53:13
2019-12-11 17:53:13 models.py class DomainDir(models.Model): date = models.DateTimeField() views.py ...
- 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...