C#管理员权限以及多进程的问题

问题描述

C#管理员权限以及多进程的问题

正在用C#写一个能通过窗口来进行链接(mklink)的小程序。
一、由于mklink需要管理员权限运行,所以程序与必须使用高 权限。于是很快的写出了代码,感觉不错。但是依靠复制来获取链接路径还是 很不方便,于是尝试加入拖拽文件(夹)获取路径的功能。
二、通过网上的资料,很快写好了该功能。但是问题出现了。因为win7的权限问题,导致在高权限下拖拽无法获得路径。普通权限是可以的。
三、于是又开始百度,找到了一种消息过滤的方法,大喜,写好了代码,问题依在,于是又上网查,发现winform程序的拖拽并没有用消息机制,而是用的API回掉
四、无语中,于是想到了一下办法,先启动一个高权限进程作为后台,再由该高权限进程创建一个用户权限窗体进程。获取拖拽路径后窗体进程像后台进程发送数据以启动后台进程实现mklink命令。
问题是如何实现上诉的思想呢?

解决方案

di典型的服务,普通应用架构
服务进程处理去高权限的工作,普通应用处理winform。
进程间通信来交换数据

解决方案二:

程序提高权限有两种做法,一个是整体提高权限,也就是通过manifest实现。一个是给某个方法提高权限,用PrincipalPermission实现。

解决方案三:

比如说你调用mklink的方法

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTINAdministrators")]
void method(...)
{
...
}
这样你的主程序本身是没有提权的,只是调用这个方法才提权。

解决方案四:

倒过来就容易多了:让普通权限进程去启动一个高权限进程(当然是通过UAC授权)。
这个可以通过Process.StartInfo.Verb = "runas";来实现。它相当于你右击一个程序,并选择'Run as administrator'。

        static void StartCmdServer(int listenningPort)
        {
            Process p = new Process();
            p.StartInfo.Verb = "runas"; // 相当于你右击一个程序,并选择'Run as administrator'
            p.StartInfo.FileName = System.Reflection.Assembly.GetEntryAssembly().Location;
            p.StartInfo.Arguments = " /server /port:" + listenningPort;
            p.Start();
        }

你的程序app.manifest中要去掉requireAdministrator,并用命令行参数来决定是运行普通进程,还是高权限进程:

        [STAThread]
        static void Main(string[] args)  // 加上string[] args
        {
            Program.IsCmdServer = args.Any(arg => arg.ToLower() == "/server");
            if (Program.IsCmdServer)
            {
                RunAsServer(args);
            }
            else
            {
                Program.CmdSender = CmdSender.Start();
                StartCmdServer(Program.CmdSender.BoundPort);
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
时间: 2024-09-12 12:55:24

C#管理员权限以及多进程的问题的相关文章

windows 7-运行一个基于Java的程序总是要求管理员权限怎么办?

问题描述 运行一个基于Java的程序总是要求管理员权限怎么办? #我的操作系统是windows 7. 安装了一个叫**Geogebra**的几何作图软件.这个软件是用Java开发的开源软件. 之前使用一直是正常的,最近一段时候,突然发生了一系列的怪事: 比如一直用的Acrobat突然失效了,后来只好重新安装,用amtlib解决. 再就是重装Acrobat之后就偶然发现Geogebra不用管理员权限无法打开了,即使彻底卸载,清除注册表项,重新安装也没用:还尝试了它的portable版本,也是一样.

解决Vista下安装msi提示2869错误无管理员权限的问题

Vista下,如果开启了UAC的话,程序运行时,如果用到administrator管理员权限,通常会自动弹出提示框,或者在程序的右键菜单中,会有一项"以管理员身份运行". 而msi文件,却没有"以管理员身份运行"这个选项,这就造成,如果msi需要管理员权限,就会报2869 错误. 怎么办? 要解决这个问题,可以采用"曲线救国"的策略,利用一个 bat 文件包装一下msi 来执行.咋样,这个方法比较巧妙吧? 新建一个bat文件, 例如: insta

在VC中添加资源文件,使程序在Vista上用管理员权限运行

就像大家使用Vista优化大师或者Windows磁盘整理大师那样,如果开启了UAC用户账户控制系统,那么图标上面都会有个盾牌小图标,而且在运行的时候,也会提示需要管理员权限.这些,是怎么做到的呢? 对于VC程序员来说,这个过程其实并不复杂,大家看下下面的代码: ///////// 本行以下为代码,不含本行 <?xml version="1.0″ encoding="UTF-8″ standalone="yes"?> <assembly xmlns=

如何取得Win7文件的管理员权限

从Vista系统开始,微软为了提供系统安全性,开始强调对于Windows文件的所有权,以及程序运行时的用户权限,限制程序对系统重要文件的篡改.不过这样也给我们平时使用带来了一些问题,同样WIndows7也有权限问题.当我们发现某些文件无法修改时,我们就需要取得这个文件的管理员所有权,取得之后,我们就可以随心所欲的去修改它了. 我们要介绍的技巧就是如何,取得某一个文件或文件夹的所有权.: 方法一:为Windows7的右键菜单添加取得所有权的菜单:具体实现的方法不难,将以下内容另存为文本文件,然后修

如何获得Win7超级管理员权限

要想在Win 7中操纵自如,我们就需要拥有Win 7超级管理员权限!Win 7操作系统的很多操作都需要超级管理员才能运行,然而又是如何获得Win 7超级管理管理员权限的呢?本文给大家介绍获得Win 7超级管理员权限的办法. 1.打开Win7操作系统的控制面板,在"系统和安全-管理工具"目录下找到并打开"计算机管理". 2.在"计算机管理"窗口左侧展开"本地用户和组"目录,点击"用户"文件夹,窗口右侧会列出当

win8.1系统复制文件提示“你需要提供管理员权限”怎么办

win8.1系统复制文件提示"你需要提供管理员权限"怎么办   解决方法:windows8教程 一.如果是域电脑,请与公司网络管理人员联系.可能是微软的某些重要文件受到微软的保护,不允许复制.这个时候只要断网就可以解决. 二.如果是个人电脑,确认一下您的硬盘所有人账号是谁. 可以尝试下面例子: 1.尝试还原D盘默认权限 Win +X打开"命令提示符(管理员)",复制以下命令并在命令提示符中点击鼠标右键,点击"粘贴",随后按回车键(Enter)执行

win7系统账户怎样永久获取管理员权限?

  win7系统账户怎样永久获取管理员权限? 1.点击开始菜单,在"计算机"上单击右键选择"管理"; 2.在计算机管理界面依次展开"计算机管理"-"本地用户和组"-"用户"; 3.在窗口右侧双击"administrator",在"administrator 属性"的"常规"选卡中将"账户已禁用"的勾去掉,点击应用并确定; 4.在

Win8系统取得超级管理员权限的方法

使用Win8在找开系统文件夹是经常提示:无法访问--,拒绝访问.就是没有超级管理员权限所致,取得Win8超级管理员权限很容易,导入一个注册表文件就可以实现,并且操作简单. 不管是使用Win8还是Win7,在打开C盘的一些文件夹时,经常会遇到无法访问的情况,以致于想删除已经确认没有用的文件时删除不了.Win7下很好办,各种工具皆可实现在右键菜单添加取得管理员权限按钮.现在主要介绍Win8下如何为鼠标右键菜单添加取得管理员权限选项. 新建一个记事本将下面的代码Copy进去保存,记事本名字无所谓,记住

通过手动导入注册表获取Win7管理员权限

通过手动导入注册表获取Win7管理员权限 有一种现象叫咱自己的电脑,咱也明明是超级管理员.但Win7 人家不承认,特别是当你要对system下的文件下手时,Win就愣是睁眼说瞎话,什么必须拥有管理员权限才能进行操作.我怎么就没有权限了. 当然,可能人家也是出安全考虑,虽然这种机制咱大伙也不是相当了解的十分透彻.好在人家还没有把你给弄上绝路,好歹还给咱留了写其他的途径,比如咱们就可以通过手动导入注册表来获取本属于你的管理员权限. 下满四步邹: 1.随便建一过.reg为后缀的文件. 2.将下面的代码