• WPF使用Microsoft.VisualBasic创建单例模式引起的权限降低问题


    在进行WPF开发时,总是在找更加优雅去写单例模式的代码。

    很多人都喜欢用Mutex,一个App.cs下很多的Mutex,我也喜欢用。

    看完《WPF编程宝典》的第七章Applicaton类后,为了代码的美观和整洁,我就使用了7.2.5章节的《单实例应用程序》的思路来创建项目中的单实例应用。

    项目中主要添加Microsoft.VisualBasic引用,写继承自WindowsFormsApplicationBase的Wrapper来控制单例。

      public class SingleInstanceAppWrapper : WindowsFormsApplicationBase
            {
                private WpfApp app;
    
                public SingleInstanceAppWrapper()
                {
                    this.IsSingleInstance = true;
                }
            }    

    通过在Wrapper的构造函数中设置IsSingleInstance=true来控制单例。

    通过重写OnStartupNextInstance来控制单例,这样就多程序就自动通过OnStartupNextInstance来实现了进程间的通信。

      protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
                {
                    if (eventArgs.CommandLine.Count > 0)
                    {
                       
                        string arg = eventArgs.CommandLine[0];
                        //单例中的逻辑
                    }
                }            

    再设计升级程序时因为安全问题,程序提升了权限,还是保持以向单例模式。就在这时候出现问题了!检查升级设置文件权限时发现程序一直再报错。无法继续执行了。

    程序启动的时候是计划任务使用管理员权限启动,启动时检查权限,权限正常。

    System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                    System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                    if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
                    {
                      //如果走到这里是管理员。当前程序是管理员
                    } 

    而通过启动参数通知程序时OnStartupNextInstance中获取一次权限,竟然不是管理员了。因为当时产品催着上线。所有没有做更多的分析。而是修改了通知方式。不使用启动参数。而更换成了窗体消息。

    高权限接收低权限发送的窗体消息时需要在高权限添加消息筛选器。低权限需要发送哪些消息,高权限就需要添加哪些消息到筛选器,不然无法接收。

     [DllImport("user32.dll")]
            public static extern bool ChangeWindowMessageFilterEx(IntPtr HWnd, uint Msg, int WParam, IntPtr LParam);

    函数为ChangeWindowMessageFilterEx 具体用法必应一下。

    我创建了一个C#相关的交流群。用于分享学习资料和讨论问题。欢迎有兴趣的小伙伴:QQ群:542633085

  • 相关阅读:
    4-8(四)badboy 脚本录制工具的安装
    4-8(三)Jmeter 工具的基本使用
    4-8(二)jmete 主要文件目录及简单了解 http 协议
    4-8(一)jmeter 基础概念、什么时候做性能测试、性能测试的前提、性能测试主要指标、开展性能测试必备条件
    jmeter 介绍及 windows/Linux下安装
    如何测试(四)朋友圈如何测试?
    如何测试(二)聊天功能如何测试?
    如何测试(一)优惠券如何测试?
    如何测试(三)购物车如何测试?
    自动化面试题三(41 ~ 73)
  • 原文地址:https://www.cnblogs.com/duwenlong/p/14359855.html
Copyright © 2020-2023  润新知