最近因爲項目需要,花了一段時間來研究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模式可以正常運行,大家不妨試試。