C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限

Mutex不仅提供跨线程的服务,还提供跨进程的服务。当在构造函数中为Mutex指定名
称时,则会创建一个命名了的Mutex。其他线程创建Mutex时,如果指定的名称相同,则返
回同一个互斥体,不论该线程位于哪个进程或者应用程序域中。

使用命名互斥体的一个例子是创建Singleton应用程序,即只能打开一个实例的应用程
序。显然,我们创建的控制台应用程序是可以同时打开多个实例的。下面的代码使用Mutex
实现了只能同时开启一个Console控制台程序。


            string asm = Assembly.GetExecutingAssembly().GetName().Name;
            Mutex mtx = new Mutex(false, asm);

            if (mtx.WaitOne(TimeSpan.FromMilliseconds(100)) ? false : true;)
            {
                MessageBox.Show("采集程序已经运行在此电脑上", "登录重复提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
               //逻辑操作处理// Thread.CurrentThread.Abort();
            }

获取farmwork版本号

  string farmWorkVersion = "4.5.2"; private static bool GetDotNetVersion(string version)
        {
            string oldname = "0";
            using (RegistryKey ndpKey =
                RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").
                OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {
                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string newname = (string)versionKey.GetValue("Version", "");
                        if (string.Compare(newname, oldname) > 0)
                        {
                            oldname = newname;
                        }
                        if (newname != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            newname = (string)subKey.GetValue("Version", "");
                            if (string.Compare(newname, oldname) > 0)
                            {
                                oldname = newname;
                            }
                        }
                    }
                }
            }
            return string.Compare(oldname, version) > 0 ? true : false;
        }

获取管理员权限

  private static void ProcessStart()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            /**
            * 当前用户是管理员的时候,直接启动应用程序
            * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
            */
            //获得当前登录的Windows用户标示
            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))
            {
                //如果是管理员,则直接运行
                Application.Run(new FrmLogin());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                try
                {
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch
                {
                    return;
                }
                //退出
                Application.Exit();
            }
        }

原文地址:https://www.cnblogs.com/wangcl-8645/p/10614282.html

时间: 2024-08-10 08:53:51

C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限的相关文章

PHP实现程序单例运行

原创文章,转载请注明出处:http://huyanping.sinaapp.com/?p=222 作者:Jenner 一.场景描述: 最近我们一块业务,需要不断的监听一个目录的变化,如果目录中有文件,则启动PHP脚本处理掉.最初的方案是使用crontab执行sh脚本,脚本大概如下: SOK=`ps -ef |grep /www/sender.sh | grep -v grep|wc -l` if [[ "$SOK" < "2" ]];then for f in

C#实现程序单例日志输出

对于一个完整的程序系统,一个日志记录是必不可少的.可以用它来记录程序在运行过程中的运行状态和报错信息.比如,那些不想通过弹框提示的错误,程序执行过程中捕获的异常等. 首先,在你的解决方案中,适当的目录中新建一个类,比如 LogManager: 编写如下代码: 1 /// <summary> 2 /// 日志管理 3 /// </summary> 4 public class LogManager 5 { 6 private string _logDir; // 日志文件存放目录 7

C#应用程序单例并激活程序的窗口 使其显示在最前端

public class SoftHelper { ///<summary> /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <param name="hWnd">窗口句柄</param> /// <param name="cmdShow">指定窗口如何显示.查看允许值列表,请查阅ShowWlndow函数的说明部分</param> /// <retu

Inno Setup安装程序单例运行

1.缘起: KV项目下载底层升级包,老是报出升级文件占用问题,反复分析,不得其所. 今天突然发现同时启动多个升级程序实例,分析认为安装包同时被调用多次,导致实例访问文件冲突,导致此问题. 安装程序由Inno Setup制作,遂找其解决方案,最先想到的是互斥体,就由此开始! 2.AppMutex [Setup] AppMutex=MyAppMutex 安装程序Setup段,此互斥变量,会在安装程序启动时检测是否有此互斥体的程序在运行,若有则提示: 通常,在程序中置同名互斥体,此入判断,可避免程序在

让Android程序单例运行

<?xml xxxx?> <manifest xxxxxxx>     <application android:icon="@drawable/icon"           android:label="@string/app_name"         android:launchMode="singleInstance">     <activity android:name=".Mai

Java中Class和单例类的作用与类成员的理解

Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存这些信息的类称为Class.可能容易产生混淆,容易想到class.不过二者没什么关系,class不过是描述类的一个关键字.而Class却是保存着运行时信息的类. 它能做什么?Class类可以帮助我们在程序运行时分析类,说白了就是获取类中的值.可能瞬间就想到了反射,没错!Class一般就是和反射配套使

黑马程序员——Java基础---单例

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                         单例 设计模式:解决问题最行之有效的方法,让问题简单化,Java中有23种. 单例:解决一个类在内存,只有一个对象 想要保证对象唯一: 1,为了避免其他程序过多建立该类对象,

黑马程序员-学习日记(单例设计模式的两种类型)

单例设计模式:解决一个类在内存中只有一个对象 多个程序使用统一配置信息对象时,需要保证该对对象的唯一性. 保证对象唯一性的实现步骤: 1.将构造函数私有化:为了避免其他程序过多建立该对象,禁止其他程序调用该对象. 2.在类中创建一个本类对象:为了让其他程序可以访问该类对象 3.提供一个方法可以获取到该对象的方法:方便其他程序访问自定义的本类对象.(类方法的访问方式只有两种,建立对象或定义为静态方法)

单例访问Android应用程序对象

1.单例模式: 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 2.单例模式优势: 由于单例模式在内存中只有一个实例,减少了内存开销 单例模式可以避免对资源的多重占用. 单例模式可以在系统设置全局的访问点,优化和共享资源访问. 2.问题:需要从android应用程序中去访问全局数据 解决