UAC相关问题分析--使用管理员权限打开VisualStudio,无法访问网络磁盘,无法拖拽文件

搬运自http://wurang.me/2014/06/17/uac-problems.html

【问题产生】

问题最初是在administrator权限下,visual studio 打开网络磁盘下的文件报错。经过几次调试,最终发现是问题是在管理员权限下,vs无法访问网络磁盘。

Console.Write( System.IO.File.Exists(path));

该结果返回False。为了确认是由于权限问题引起,使用非管理员权限打开vs,运行上面的程序,结果返回True。

至此问题确立:win7/win8下,使用管理员权限打开VisualStudio,无法访问网络磁盘。

【问题分析】

首先让我想到的是很久之前,发现用管理员权限打开VisualStudio后,没办法把文件直接拖拽到VS中打开,我的理解是,管理员权限下的VS比普通文件有更高的“安全级别”,windows不允许从低级别向高级别发送调用命令,事实上也确实如此。

解决方案一:使用系统administrator账户

实验一:

  1. 进入C:\Windows目录
  2. 找到并打开notepad.exe(用户权限)
  3. 拖拽其他文本文件到打开的记事本应用,发现是可以正常打开的,然后关闭所有文件
  4. 右键以管理员权限打开notepad.exe
  5. 再拖拽同样的文本文件到记事本应用,这时候可以看到是没有办法将文件拖拽进来的

知道问题由权限引起,那么接下来就是如何设置权限。



由于VS是管理员权限而其他文件是用户权限,所以考虑使用administrator账户,让所有文件都拥有管理员权限。

  1. 运行lusrmgr.msc
  2. 本地用户和组--用户--administrator--去掉“账号已禁用”的勾,确认退出
  3. 切换用户,使用administrator用户登录

ps:win7家用版没有lusrmgr.msc,开启administrator的方法这里不再细说。

这时候所有文件都拥有管理员权限,测试一下问题,发现可以正常返回True了。但使用Administrator是一种不安全的方式。而且也比较麻烦,所以继续探究解决方案。



解决方案二:干掉UAC

在网上看到一篇论文《Vista系统管理员权限下文件禁止拖拽解决方案》,这和我的问题非常相近,文章提了三点:介绍UIPI,提出修改注册表的方式解决问题,提出使用windows api方式解决问题。

UIPI:User Interface Privilege Isolation(用户界面特权隔离),详细的介绍可以参考微软白皮书,简单来说,它是UAC的核心,做安全权限用的。说到这里,问题更专业化了,MSDN的Blog中有人遇到了同样的问题(Pat‘s Windows Development Blog),这里面用专业的术语描述了我最开始的理解:

Lower Privilege Processes Can’t Interfere with Higher Privilege Processes

当然,里面也提出了解决方案:不要使用管理员权限,或者不要开启uac。

实验二:

在UIPI的微软白皮书中提到使用“Process Explorer”查看UIPI,这里也作为一个实验:

  1. 下载Process Explorer
  2. 打开Process Explorer,在GridView的Header上右键,选择Select Columns,勾选Integrity Level
  3. 观察所有应用的UIPI,如果是以普通用户权限打开,那么我们最多能看到Medium的level
  4. 如果用右键管理员打开,所有的UIPI才可以看到

这个实验也说明了低权限不能够访问高权限的问题。



现在回到论文中,里面提到通过修改注册表的方式关闭UIPI: 将HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies\System下的EnableUIPI设置成0

进入注册表编辑器,发现并没有这样一个值,不过却发现了EnableLUA,其实EnableUIPI是visita下的值,而在win7/win8下则是EnableLUA.

EnableLUA的值设成0,重启计算机,然后以管理员权限运行VS,测试问题,结果返回True。其实关闭UAC和使用administrator账户是一样的效果,都是获取了最高权限,但都是不安全的,能不能寻找一个简单又安全的方法来解决问题?

ps:论文中提到的第三点是使用windows api,有兴趣的可以阅读ChangeWindowMessageFilter相关资料,其原理是将拖拽等操作添加到白名单,这样就不会被UIPI拦截。但我们的问题并不是拖拽问题,而是找不到路径,所以这里不再过多讨论。



解决方案三:在管理员权限下配置磁盘映射

经过上面的分析,对UAC逐步有了更深的理解,但想一想,跟UAC扯上关系,不管哪一种方法都麻烦,而且在调试中又发现了下面的问题:

实验三:

  1. 配置一个网络磁盘映射(Z盘)
  2. 用普通用户权限打开记事本或者VS---文件---打开,观察文件资源管理器。这里是可以看到Z盘的。
  3. 用管理员权限打开记事本或者VS---文件---打开,再观察文件资源管理器。发现根本就没有Z盘。

其实问题一开始就走弯路了,难怪System.IO.File.Exists(path)会找不到路径,这里压根就没有Z盘。那我们在这里配置一下网络磁盘映射Y盘:

配置完成后可以看到Y盘了,然后运行一下程序,找找Y盘的路径,结果返回True。然而我们在“我的电脑”中却看不到Y盘,如果以普通用户权限打开文件资源管理器,也看不到Y盘(除非是administrator账户,Z盘Y盘都可见),这么说来,管理员权限和用户权限下的Z盘Y盘就像是在两个世界,这也就是UAC的功能不是么?隔离,sandbox!

【问题总结】

至此所有问题全部解决。解决方法如下:

  1. 使用administrator账户
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies\SystemEnableLUA值改为0,重启即可
  3. 在管理员权限下打开VS或者其他工具,在文件资源管理器中设置网络磁盘映射即可

UAC相关问题分析--使用管理员权限打开VisualStudio,无法访问网络磁盘,无法拖拽文件,布布扣,bubuko.com

时间: 2024-12-23 19:42:05

UAC相关问题分析--使用管理员权限打开VisualStudio,无法访问网络磁盘,无法拖拽文件的相关文章

让win7变成无线路由(需要用管理员权限打开)最后完善.rar

让win7变成无线路由(需要用管理员权限打开)最后完善.bat @ECHO OFF CLS color 0a netsh wlan show drivers ECHO.★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ECHO.★以上是你的无线网卡信息,查看你的网卡是否支持承载网络★ ECHO.★ ★ ECHO.★ 持请更新一个通过微软认证的驱动! ★ ECHO.★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ECHO. ECHO. GOTO MENU :MENU ECHO.

HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开

在使用visual studio 2013启动self host webapi时候碰到下面的错误: 详细错误信息如下: HTTP could not register URL http://+:86/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details 大概意思是和安全相关的问题, 可以按照http://g

C#使用管理员权限打开cmd执行命令行

最近遇到个棘手的问题,服务器远程连不上,但是ftp可以,可能远程连接的服务挂了或者防火墙入站规则有点问题,想要重启,得找机房工作人员,还是挺麻烦的 想了想可以上传个执行cmd命令的东西,然后远程访问触发,执行命令添加一条入站规则,但是呢一般的命令行又不够权限,只能以管理员权限打开才能执行这个 命令,往入站规则里面先添加一条规则:[netsh advfirewall firewall add rule name=\"allow 24897\" protocol=TCP dir=in lo

linux使用管理员权限打开一个文件管理器(右键root打开文件)

使用管理员权限打开一个文件管理器 sudo nautilus 加入右键以管理员身份打开 sudo apt install nautilus-admin 安装完成后,必须重新启动 Nautilus nautilus -q 注意:nautilus-gksu 已经不再工作了,替换为这里使用的“Nautilus管理”扩展,在官方的Ubuntu仓库中. 右键在终端打开: sudo apt-get install gnome-terminal 原文地址:https://www.cnblogs.com/xlp

通过组策略禁止有本地管理员权限的域用户更改网络配置

没有管理员权限的用户,默认就没有权限更改计算机的IP地址.本示例主要用于禁止管理员来更改计算机的IP地址,登录的用户都是计算机的本地管理员. Network Connections服务管理"网络和拨号连接"文件夹中对象,在其中您可以查看局域网和远程连接.如果停止该服务,用户将不能访问本地连接来更改IP地址. 本示例能够控制包括本地用户和域用户.普通用户以及管理员来通过本地连接属性修改IP地址. 如果允许域管理能够修改客户计算机的IP地址,可以将Network Connections服务

一直使用管理员权限打开PowerShell

下面以Win10系统为例: 在搜索处,填写"powershell"对着列出的程序图标点击右键,进入"打开文件所在位置" 对着程序图标,点击右键选择"属性",依次按下图设置

安卓即使增加了权限也不可以访问网络

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.marivn_android_test_http"     android:versionCode="1"     andro

如何在程序里模拟在cmd里用管理员权限运行一条指令

转自csdn的yangw150,zhao4zhong1 转自http://www.cnblogs.com/del/archive/2008/02/13/1068229.html http://blog.csdn.net/go121015603/article/details/41870707 win7下,我想执行net user administrator /active:yes这样一条指令,用system()函数执行时返回错误,返回错误是“发生系统错误 5 拒绝访问”,原来是没有管理员权限,用

windows Service启动带有管理员权限的进程

事情是这样的,公司的产品有个守护进程(windows Service)需要启动产品的主程序exe,让主程序它运行为管理员权限(因为主程序会加载一个插件,插件中有列出端口监听的功能,需要由端口查找到进程PID,由进程PID查找进程名或进程镜像路径,这些对于一些特殊进程例如svchost需要有管理员权限才能查到进程名和路径).windows下的程序是不能在运行时获得管理员权限的,只能在创建进程的时候提升为管理员权限.如果是普通进程运行一个管理员权限程序,可以调用ShellExcute API.双击鼠