Silverlight操作客戶端註冊表、運行/卸載本地程序

最近因爲項目需要,花了一段時間來研究Silverlight對本地註冊表的操作,找了很多資料,但是都不滿足需求,後來自己將VBS操作註冊表的代碼重新修改移植到Silverlight上,覺得挺好用的,特意將其摘取出來,供大家分享(OOB模式下纔可以)。

1.Silverlight代碼:
<navigation:Page x:Class="LogInfoTest.Register" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Register Page">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="獲取本機已安裝軟件的列表" FontSize="12" VerticalAlignment="Top" Margin="0,8,0,0"></TextBlock>
        <sdk:DataGrid Margin="0,34,0,0" x:Name="DataGrid1" AutoGenerateColumns="False">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Binding="{Binding RegName, Mode=TwoWay}" CanUserReorder="False" Header="註冊表名稱" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayName, Mode=TwoWay}" CanUserReorder="False" Header="軟件名稱" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayVersion, Mode=TwoWay}" CanUserReorder="False" Header="軟件版本" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding Publisher, Mode=TwoWay}" CanUserReorder="False" Header="發佈者" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding InstallLocation, Mode=TwoWay}" CanUserReorder="False" Header="安裝目錄" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding InstallDate, Mode=TwoWay}" CanUserReorder="False" Header="安裝時間" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding DisplayIcon, Mode=TwoWay}" CanUserReorder="False" Header="運行路徑" IsReadOnly="True" />
                <sdk:DataGridTextColumn Binding="{Binding UninstallString, Mode=TwoWay}" CanUserReorder="False" Header="卸載路徑" IsReadOnly="True" />
                <sdk:DataGridTemplateColumn Header="操作">
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Button x:Name="btnRun" Content="運行" DataContext="{Binding DisplayIcon}" Click="btnRun_Click" />
                                <Button x:Uid="btnUnin" Content="卸載" DataContext="{Binding UninstallString}" Click="Button_Click" Margin="5,0,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
    </Grid>
</navigation:Page>

2.後臺代碼:

using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

using System.Runtime.InteropServices.Automation;

namespace LogInfoTest
{
    /// <summary>
    /// 註冊表對象
    /// </summary>
    public class RegInfo
    {
        /// <summary>
        /// 註冊表名稱
        /// </summary>
        public string RegName { get; set; }
        /// <summary>
        /// 軟件名稱
        /// </summary>
        public string DisplayName { get; set; }
        /// <summary>
        /// 軟件版本
        /// </summary>
        public string DisplayVersion { get; set; }
        /// <summary>
        /// 發佈者
        /// </summary>
        public string Publisher { get; set; }
        /// <summary>
        /// 安裝目錄
        /// </summary>
        public string InstallLocation { get; set; }
        /// <summary>
        /// 安裝日期
        /// </summary>
        public string InstallDate { get; set; }
        /// <summary>
        /// 運行路徑(可能是圖標路徑)
        /// </summary>
        public string DisplayIcon { get; set; }
        /// <summary>
        /// 卸載路徑
        /// </summary>
        public string UninstallString { get; set; }
    }

    public partial class Register : Page
    {
        private ObservableCollection<RegInfo> ListReg;

        dynamic ObjReg = null; //註冊表訪問對象

        public Register()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(Register_Loaded);
        }

        // 當用戶導航到此頁面時執行。
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void Register_Loaded(object sender, RoutedEventArgs e)
        {
            ListReg = new ObservableCollection<RegInfo>();

            dynamic ShellApplication = null;
            try
            {
                ShellApplication = AutomationFactory.CreateObject("WbemScripting.SWbemLocator"); //創建Shell對象
            }
            catch
            {
                MessageBox.Show("權限不足,請再OOB模式下運行。");
                return;
            }

            ObjReg = ShellApplication.ConnectServer(".", @"/root/default"); //連接到主機
            ObjReg = ObjReg.get("StdRegProv"); //創建註冊表訪問對象

            string HKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            object[] InstalledSoft = GetSubKeys(HKey);
            if (InstalledSoft != null)
            {
                foreach (object SoftItem in InstalledSoft)
                {
                    RegInfo reg = DisposeSubKey(HKey, SoftItem.ToString());
                    if (reg != null && !string.IsNullOrEmpty(reg.DisplayName))
                    {
                        ListReg.Add(reg);
                    }
                }
            }

            this.DataGrid1.ItemsSource = ListReg;
        }
        /// <summary>
        /// 獲取註冊表下的某一項的子項
        /// </summary>
        /// <param name="ObjReg">Shell對象</param>
        /// <param name="HKey">要遍歷的註冊表路徑</param>
        /// <returns>子項集合</returns>
        private object[] GetSubKeys(string HKey)
        {
            object[] result = null;

            dynamic RegMethod = ObjReg.Methods_("EnumKey"); //爲Shell對象添加方法名稱
            dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //爲Shell對象添加參數
            RegParam.hDefKey = 0x80000002; //設置參數的主目錄(HKLM)
            RegParam.sSubKeyName = HKey; //設置參數的子目錄

            dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //執行方法且獲取返回值
            if (ReturnParam.ReturnValue == 0) //操作正常
            {
                try
                {
                    result = (object[])ReturnParam.sNames; //獲取子項集合
                }
                catch { }
            }
            return result;
        }
        /// <summary>
        /// 獲取註冊表對象
        /// </summary>
        /// <param name="ObjReg">Shell對象</param>
        /// <param name="HKey">註冊表路徑</param>
        /// <param name="SubKey">子項名稱</param>
        /// <returns>註冊表對象</returns>
        private RegInfo DisposeSubKey(string HKey, string SubKey)
        {
            RegInfo reg = new RegInfo(); //創建註冊表對象

            dynamic RegMethod = ObjReg.Methods_("GetStringValue"); //爲Shell對象添加方法名稱
            dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //創建Shell對象的參數
            RegParam.hDefKey = 0x80000002; //設置參數的主目錄(HKLM)
            RegParam.sSubKeyName = HKey + @"\" + SubKey; //設置參數的子目錄

            reg.RegName = SubKey;

            RegParam.sValueName = "DisplayName"; //設置參數的子鍵名稱
            dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //執行方法且獲取返回值
            reg.DisplayName = Convert.ToString(ReturnParam.sValue);
            if (string.IsNullOrEmpty(reg.DisplayName))
            {
                return reg;
            }

            RegParam.sValueName = "DisplayVersion";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.DisplayVersion = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "Publisher";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.Publisher = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "InstallLocation";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.InstallLocation = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "InstallDate";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.InstallDate = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "DisplayIcon";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.DisplayIcon = Convert.ToString(ReturnParam.sValue);

            RegParam.sValueName = "UninstallString";
            ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);
            reg.UninstallString = Convert.ToString(ReturnParam.sValue);

            return reg;
        }
        /// <summary>
        /// 運行程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRun_Click(object sender, RoutedEventArgs e)
        {
            string key = ((Button)sender).DataContext.ToString(); //獲取運行路徑
            if (string.IsNullOrEmpty(key))
            {
                MessageBox.Show("無法運行該程序。");
                return;
            }
            using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell")) //創建Shell對象
            {
                try
                {
                    cmd.Exec(@key); //運行軟件
                }
                catch (Exception)
                {
                    MessageBox.Show("無法運行該程序。");
                }
            }
        }
        /// <summary>
        /// 卸載程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string key = ((Button)sender).DataContext.ToString(); //獲取卸載路徑
            if (string.IsNullOrEmpty(key))
            {
                MessageBox.Show("無法卸載該程序。");
                return;
            }
            using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell")) //創建Shell對象
            {
                try
                {
                    cmd.Exec(@key); //執行卸載程序
                }
                catch (Exception)
                {
                    MessageBox.Show("無法卸載該程序。");
                }
            }
        }
    }
}

經測試,在OOB模式可以正常運行,大家不妨試試。

發佈了11 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章