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)解决解决了它。

http://www.shangxueba.com/jingyan/99752.html

时间: 2024-12-27 19:29:43

Windows 7开发:UAC数据重定向 - Win32 Native的相关文章

Windows App开发之文件与数据

读取文件和目录名 这一节開始我们将陆续看到Windows App是如何操作文件的. 在Windows上读取文件名称.目录名 首先我们在XAML中定义一个Button和TextBlock,将读取文件/目录名的过程写在前者的click事件中.后者则用来显示文件信息. <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Orientation="Ho

【万里征程——Windows App开发】如何保存、读取、删除应用数据

在前面的几篇博客中,都是关于数据的,这方面的内容其实还有很多很多,省略掉一部分后,也还是有很多.这一篇将是很重要的一部分,关于保存和读取数据,对于游戏而言,这一点尤其重要. 先来看看一个大概的背景吧,我这里写的很简单啦^_^ 保存的内容就是这四个框框里填写的数据咯.先上XAML代码. <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Orientati

Windows驱动开发(中间层)

Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385.1) 地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 2.下载InstDrv软件(用于安装.启动.停止.卸载驱动) 界面如下: 注:srvinstw.exe 也可以安装.卸载sys文件,但需要手动开启.关闭,即在cmd命令窗口下执行

windows phone开发-Webbrowser使用技巧

5月份开发了脸萌WP版,其中需要使用web技术来绘制图像,于是就使用了原生webbrowser控件.在使用webbrowser control的过程中,发现了一些坑,也总结的几个小技巧,分享给大家. 首先我们需要了解下webbrowser control,与桌面windows平台上的webbrowser一样,都是基于IE内核封装的web展示控件,用法与wpf基本一致,同时也是非托管资源,但wp平台上没有实现IDispose接口,带了了内存控制的挑战.此外,webbrowser本身支持有限的js

Windows驱动开发基础(八)内存管理

Windows驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38826159 就32位的计算机来说,他有4G的真实的物理内存.但是这样是不够的,于是引入了虚拟内存的概念.使得每一个进程都有4G的虚拟内存. 虚拟内存实际上就是采用了一种映射的方式.4G的内存实际上被分页.一般来说一个页的大小是4K.也是说它被分为了1M个页.在这么多的页里面,有一部分是对应于物理内存的(可以是多对一的):有一部分是对应于磁盘上的空间,但

安卓开发_数据存储技术_sqlite

一.SQLite SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了.SQLite已经被多种软件和产品使用 二.SQLite特性 1 2 1.轻量级 3 SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器.使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能.而且那个动态库的尺寸也相当小. 4 2.独立性 5 SQLite数据库的核心引擎本身

游戏开发(三)——WIN32 黑白棋(三)——游戏画面的现实

整个游戏分3部分介绍. 1.棋局的现实 2.AI的现实 3.游戏画面的现实 提供一下完整项目下载 这是第三部分:画面的显示 这部分其实就比较简单的,说白了就是api的堆砌. 主要了解下windows的消息机制,以及怎么画图 主要是分别封装了下对棋盘,棋子,以及当前轮到谁,当前比分是多少,就是游戏画面上不同的部分的绘制. void DrawReversiBoard(); void DrawReversiPieces(EnumReversiPiecesType type, int row_y, in

基于科大讯飞语音云windows平台开发

前记: 前段时间公司没事干,突发奇想想做一个语音识别系统,看起来应该很简单的,但做起来却是各种问题,这个对电气毕业的我,却是挺为难的.谷姐已经离我们而去,感谢度娘,感谢CSDN各位大神,好歹也做的是那么回事了,虽然还是不好用,但基本功能实现了. 该软件使用VS2008C++/CLR开发,由于科大讯飞提供的是C的API接口,结果到这边就是各种不兼容,CLR是基于托管堆运行的,而这个API有是非托管堆的,使用了各种指针,原本打算使用C#来做,最后门外汉的我也没能做到C#和C指针完美结合,真怀恋单片机

gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发