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

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

4个回答

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

oyljerry
oyljerry 回复kitian616: 对。很多杀毒软件都是这种架构
5 年多之前 回复
kitian616
田小777 你是指用写一个windows服务来做后台,一个普通exe应用做前台?
5 年多之前 回复

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

kitian616
田小777 学习了,不过现在的问题是如何让一个高权限进程去启动一个普通权限的进程。也就是权限的降级。
5 年多之前 回复

比如说你调用mklink的方法

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

kitian616
田小777 毕竟每次mklink都要获取权限也不是很方便。
5 年多之前 回复
kitian616
田小777 学习了,不过现在的问题是如何让一个高权限进程去启动一个普通权限的进程。也就是权限的降级。
5 年多之前 回复

倒过来就容易多了:让普通权限进程去启动一个高权限进程(当然是通过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());
        }
kitian616
田小777 感谢回答,过几天试试。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐