zoukankan      html  css  js  c++  java
  • silverlight 4.0 的oob模式下,调用com通过wmi重启自身进程 killself

    silverlight目前开发的应用,想做到系统内注销后自动重新启动下 sllauncher.exe ,实现方式是通过WMI的COM接口,获取到当前应用的执行命令行(CommandLine);并通过shell运行;代码如下:

    #region Using Section
    
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices.Automation;
    using System.Windows;
    
    #endregion
    
    namespace KillSelf
    {
        public class ComObjectHelper
        {
            private static List<string> GetProcess()
            {
                var result = new List<string>();
                try
                {
                    dynamic objLocator = AutomationFactory.CreateObject("WbemScripting.SWbemLocator");
                   
                    dynamic objWmiService = objLocator.ConnectServer(".", "root\cimv2");
    
                    dynamic query =
                        objWmiService.ExecQuery("Select * from Win32_Process");
    
                    foreach (dynamic o in query)
                    {
                        //string value = "ExecutablePath = " + o.CommandLine + "
    ";
                        //Console.WriteLine(value);
    
                        result.Add(o.CommandLine + "");
                    }
    
                    return result;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Get Process:" + ex.Message);
                }
                return null;
            }
    
            internal static void Exec(string cmdline)
            {
                try
                {
                    dynamic cmd = AutomationFactory.CreateObject("WScript.Shell");
                    cmd.Run(cmdline, 1, false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Execute Process:" + ex.Message);
                }
            }
    
            public static SlProcess GetSelf()
            {
                string[] procs = GetProcess().ToArray();
    
                foreach (string p in procs)
                {
                    string cmdline = p.ToLower();
                    if (cmdline.IndexOf("sllauncher.exe", StringComparison.Ordinal) != -1)
                    {
                        return new SlProcess(cmdline);
                    }
                }
                throw new NullReferenceException("未找到SLLauncher.exe进程");
            }
        }
    
        public class SlProcess
        {
            public SlProcess(string cmdline)
            {
                CommandLine = cmdline;
            }
    
            public string CommandLine { get; set; }
    
            public SlProcess Run()
            {
                ComObjectHelper.Exec(CommandLine);
                return this;
            }
    
            public SlProcess Kill()
            {
                Application.Current.MainWindow.Close();
                return this;
            }
        }
    }

    调用部分:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (!Application.Current.IsRunningOutOfBrowser)
                {
                    MessageBox.Show("Not Running OutOfBrowser!!");
                    return;
                }
                
                ComObjectHelper.GetSelf().Run().Kill();
            }
    
  • 相关阅读:
    java基础的第二轮快速学习!day08
    java基础的第二轮快速学习!day07
    java基础的第二轮快速学习!day06
    Jsp复习(详细的知识点)day01
    Struts2,大爷你好!第二天补一发笔记
    java基础的第二轮快速学习!day05
    Struts2,大爷你好!第二天
    java基础的第二轮快速学习!day04
    Struts2,大爷你好!第一天
    java基础的第二轮快速学习!day03
  • 原文地址:https://www.cnblogs.com/Chinasf/p/3781348.html
Copyright © 2011-2022 走看看