zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++中随机函数
    在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
    CCParticleSystem粒子系统
    Redis百亿级Key存储方案
    Mongodb亿级数据量的性能测试
    mysql-mongdb-redis
    java常用的几种线程池比较
    Java中的多线程
    MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
    B+树介绍
  • 原文地址:https://www.cnblogs.com/duwenlong/p/14359855.html
Copyright © 2011-2022 走看看