Silverlight操作客户端注册表(优化)(OOB模式)

2015-12-04 18:41:42来源:CSDN作者:hwt0101人点击

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:http://blog.csdn.net/lxfmq0/article/details/6682267

                 http://blog.csdn.net/lxfmq0/article/details/6682182

OOB相关说明(CSDN用户“sp1234”):

因为只有在开发环境,silverlight才悲催地“不检查安全属性”。一旦你部署到互联网上,silverlight一堆变态的安全规则全都出来了,让大部分开发人员措手不及、惊愕不已。这是silverlight这个产品的“逻辑毛病”。而 OOB上,则更尤其是无法实际部署。
使用 silverlight,用来开发各种酷炫的纯 web 多媒体应用。现在不要使用 OOB。

silverlight除了支持http以外,也支持高效率的tcp通讯,甚至还支持客户端(局域网段内)的udp组播通讯。因此你可以把silverlight程序随便部署到任何一台免费的可以打开html、asp、jsp、php的网站上(不一定是支持asp.net的网站),然后silverlight程序在客户端浏览器上运行起来之后再通过高效率的通讯来连接各种业务服务器或者设备通讯门户服务器,使用silverlight开发政府、企业的领导支持系统,大型信息化系统集成系统,很合适。


前面贴出了Silverlight在OOB模式下操作客户端的注册表,后来自己又对代码进行了优化,将其封装成了一个操作类。

1.新建一个Silverlight类库,命名为ZKR.Silverlight.Core;

2.在类库下新建类,命名为LocalRegistryModel.cs;

3.实现代码:

[html] view plaincopy
  1. using System;  
  2. using System.Net;  
  3. using System.Windows;  
  4. using System.Windows.Controls;  
  5. using System.Windows.Documents;  
  6. using System.Windows.Ink;  
  7. using System.Windows.Input;  
  8. using System.Windows.Media;  
  9. using System.Windows.Media.Animation;  
  10. using System.Windows.Shapes;  
  11.   
  12. namespace ZKR.Silverlight.Core  
  13. {  
  14.     /// <summary>  
  15.     /// 本地已安装软件的注册表对象(HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall)  
  16.     /// </summary>  
  17.     public class LocalRegistryModel  
  18.     {  
  19.         /// <summary>  
  20.         /// 注册表名称  
  21.         /// </summary>  
  22.         public string RegName { get; set; }  
  23.         /// <summary>  
  24.         /// 软件名称  
  25.         /// </summary>  
  26.         public string DisplayName { get; set; }  
  27.         /// <summary>  
  28.         /// 软件版本  
  29.         /// </summary>  
  30.         public string DisplayVersion { get; set; }  
  31.         /// <summary>  
  32.         /// 发布者  
  33.         /// </summary>  
  34.         public string Publisher { get; set; }  
  35.         /// <summary>  
  36.         /// 安装目录  
  37.         /// </summary>  
  38.         public string InstallLocation { get; set; }  
  39.         /// <summary>  
  40.         /// 安装日期  
  41.         /// </summary>  
  42.         public string InstallDate { get; set; }  
  43.         /// <summary>  
  44.         /// 运行路径(可能是图标路径)  
  45.         /// </summary>  
  46.         public string DisplayIcon { get; set; }  
  47.         /// <summary>  
  48.         /// 卸载路径  
  49.         /// </summary>  
  50.         public string UninstallString { get; set; }  
  51.   
  52.         public LocalRegistryModel()  
  53.         { }  
  54.     }  
  55. }  


4.在类库下新建类,命名为LocalMachine.cs;

5.实现代码:

[html] view plaincopy
  1. using System;  
  2. using System.Net;  
  3. using System.Windows;  
  4. using System.Windows.Controls;  
  5. using System.Windows.Documents;  
  6. using System.Windows.Ink;  
  7. using System.Windows.Input;  
  8. using System.Windows.Media;  
  9. using System.Windows.Media.Animation;  
  10. using System.Windows.Shapes;  
  11.   
  12. using System.Runtime.InteropServices.Automation;  
  13. using System.Collections.ObjectModel;  
  14.   
  15. namespace ZKR.Silverlight.Core  
  16. {  
  17.     /// <summary>  
  18.     /// 本地计算机对象(引用Microsoft.CSharp.dll)  
  19.     /// </summary>  
  20.     public class LocalMachine  
  21.     {  
  22.         #region 私有变量  
  23.         /// <summary>  
  24.         /// 注册表操作对象  
  25.         /// </summary>  
  26.         private static dynamic ObjReg = null;  
  27.         /// <summary>  
  28.         /// 已安装软件在注册表的路径  
  29.         /// </summary>  
  30.         private static string HKey = @"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall";  
  31.         #endregion  
  32.   
  33.         /// <summary>  
  34.         /// 构造函数  
  35.         /// </summary>  
  36.         public LocalMachine()  
  37.         { }  
  38.   
  39.         #region 公共方法  
  40.         /// <summary>  
  41.         /// 将该Silverlight应用程序加入开机自动启动列表  
  42.         /// </summary>  
  43.         /// <returns>程序执行过程中的提示信息</returns>  
  44.         public static string AddStartMenu()  
  45.         {  
  46.             string result = "";  
  47.             using (dynamic ShellApplication = AutomationFactory.CreateObject("Shell.Application")) //创建Shell对象  
  48.             {  
  49.                 #region 获取程序菜单中的该Silverlight应用程序的快捷方式  
  50.                 dynamic commonPrograms = ShellApplication.NameSpace(2); //获取本地开始菜单==》程序菜单  
  51.                 string allUsersPath = commonPrograms.Self.Path;  
  52.                 dynamic link = commonPrograms.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk"); //获取当前Silverlight程序的快捷方式  
  53.                 #endregion  
  54.   
  55.                 #region 获取桌面上的该Silverlight应用程序的快捷方式  
  56.                 if (link == null)  
  57.                 {  
  58.                     commonPrograms = ShellApplication.NameSpace(0); //获取本地桌面菜单  
  59.                     allUsersPath = commonPrograms.Self.Path;  
  60.                     link = commonPrograms.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk"); //获取当前Silverlight程序的快捷方式  
  61.                     if (link == null)  
  62.                     {  
  63.                         result = "在程序菜单和桌面上未找到该程序的快捷方式,不能加载到启动项中.";  
  64.                     }  
  65.                 }  
  66.                 #endregion  
  67.   
  68.                 #region 将快捷方式写入开机自动启动列表  
  69.                 if (string.IsNullOrEmpty(result))  
  70.                 {  
  71.                     using (dynamic WShell = AutomationFactory.CreateObject("WScript.Shell"))  
  72.                     {  
  73.                         WShell.RegWrite(@"HKLM/Software/Microsoft/Windows/CurrentVersion/Run/" + Deployment.Current.OutOfBrowserSettings.ShortName, link.Path);  
  74.                         result = "请重启你的机器,你的应用将被自动载入启动列表.";  
  75.                     }  
  76.                 }  
  77.                 #endregion  
  78.             }  
  79.             return result;  
  80.         }  
  81.   
  82.         /// <summary>  
  83.         /// 将该Silverlight应用程序从开机自动启动列表中移除  
  84.         /// </summary>  
  85.         /// <returns></returns>  
  86.         public static string RemoveStartMenu()  
  87.         {  
  88.             string result = "";  
  89.             using (dynamic WShell = AutomationFactory.CreateObject("WScript.Shell"))  
  90.             {  
  91.                 try  
  92.                 {  
  93.                     WShell.RegDelete(@"HKLM/Software/Microsoft/Windows/CurrentVersion/Run/" + Deployment.Current.OutOfBrowserSettings.ShortName);  
  94.                     result = "移除成功.";  
  95.                 }  
  96.                 catch  
  97.                 {  
  98.                     result = "没有找到该启动项.";  
  99.                 }  
  100.             }  
  101.             return result;  
  102.         }  
  103.   
  104.         /// <summary>  
  105.         /// 运行本地应用程序  
  106.         /// </summary>  
  107.         /// <param name="ApplicationPath">要运行的应用程序的路径</param>  
  108.         public static void RunApplication(string ApplicationPath)  
  109.         {  
  110.             if (!string.IsNullOrEmpty(ApplicationPath))  
  111.             {  
  112.                 using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell"))  
  113.                 {  
  114.                     try { cmd.Exec(@ApplicationPath); }  
  115.                     catch { }  
  116.                 }  
  117.             }  
  118.         }  
  119.   
  120.         /// <summary>  
  121.         /// 卸载本地应用程序  
  122.         /// </summary>  
  123.         /// <param name="ApplicationPath">要卸载的应用程序的路径</param>  
  124.         public static void UninstallApplication(string ApplicationPath)  
  125.         {  
  126.             if (!string.IsNullOrEmpty(ApplicationPath))  
  127.             {  
  128.                 using (dynamic cmd = AutomationFactory.CreateObject("WScript.Shell"))  
  129.                 {  
  130.                     try { cmd.Exec(ApplicationPath); }  
  131.                     catch { }  
  132.                 }  
  133.             }  
  134.         }  
  135.   
  136.         /// <summary>  
  137.         /// 获取本地已安装软件列表(忽略名称为空的软件信息)  
  138.         /// </summary>  
  139.         /// <returns>已安装软件列表</returns>  
  140.         public static ObservableCollection<LocalRegistryModel> GetInstallSoftware()  
  141.         {  
  142.             ObservableCollection<LocalRegistryModel> ListReg = new ObservableCollection<LocalRegistryModel>();  
  143.             dynamic ShellApplication = null;  
  144.             try  
  145.             {  
  146.                 ShellApplication = AutomationFactory.CreateObject("WbemScripting.SWbemLocator"); //创建Shell对象  
  147.             }  
  148.             catch { return ListReg; }  
  149.   
  150.             ObjReg = ShellApplication.ConnectServer(".", @"/root/default"); //连接到主机  
  151.             ObjReg = ObjReg.get("StdRegProv"); //创建注册表访问对象  
  152.   
  153.             object[] InstalledSoft = GetSubKeys();  
  154.             if (InstalledSoft != null)  
  155.             {  
  156.                 foreach (object SoftItem in InstalledSoft)  
  157.                 {  
  158.                     LocalRegistryModel reg = DisposeSubKey(SoftItem.ToString());  
  159.                     if (reg != null && !string.IsNullOrEmpty(reg.DisplayName))  
  160.                     {  
  161.                         ListReg.Add(reg);  
  162.                     }  
  163.                 }  
  164.             }  
  165.   
  166.             return ListReg;  
  167.         }  
  168.         #endregion  
  169.   
  170.         #region 私有方法  
  171.         /// <summary>  
  172.         /// 获取注册表下的某一项的子项  
  173.         /// </summary>  
  174.         /// <returns>子项集合</returns>  
  175.         private static object[] GetSubKeys()  
  176.         {  
  177.             object[] result = null;  
  178.   
  179.             dynamic RegMethod = ObjReg.Methods_("EnumKey"); //为Shell对象添加方法名称  
  180.             dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //为Shell对象添加参数  
  181.             RegParam.hDefKey = 0x80000002; //设置参数的主目录(HKLM)  
  182.             RegParam.sSubKeyName = HKey; //设置参数的子目录  
  183.   
  184.             dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //执行方法且获取返回值  
  185.             if (ReturnParam.ReturnValue == 0) //操作正常  
  186.             {  
  187.                 try  
  188.                 {  
  189.                     result = (object[])ReturnParam.sNames; //获取子项集合  
  190.                 }  
  191.                 catch { }  
  192.             }  
  193.             return result;  
  194.         }  
  195.         /// <summary>  
  196.         /// 获取注册表对象  
  197.         /// </summary>  
  198.         /// <param name="SubKey">子项名称</param>  
  199.         /// <returns>注册表对象</returns>  
  200.         private static LocalRegistryModel DisposeSubKey(string SubKey)  
  201.         {  
  202.             LocalRegistryModel reg = new LocalRegistryModel(); //创建注册表对象  
  203.   
  204.             dynamic RegMethod = ObjReg.Methods_("GetStringValue"); //为Shell对象添加方法名称  
  205.             dynamic RegParam = RegMethod.InParameters.SpawnInstance_(); //创建Shell对象的参数  
  206.             RegParam.hDefKey = 0x80000002; //设置参数的主目录(HKLM)  
  207.             RegParam.sSubKeyName = HKey + @"/" + SubKey; //设置参数的子目录  
  208.   
  209.             reg.RegName = SubKey;  
  210.   
  211.             RegParam.sValueName = "DisplayName"; //设置参数的子键名称  
  212.             dynamic ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam); //执行方法且获取返回值  
  213.             reg.DisplayName = Convert.ToString(ReturnParam.sValue);  
  214.             if (string.IsNullOrEmpty(reg.DisplayName))  
  215.             {  
  216.                 return reg;  
  217.             }  
  218.   
  219.             RegParam.sValueName = "DisplayVersion";  
  220.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  221.             reg.DisplayVersion = Convert.ToString(ReturnParam.sValue);  
  222.   
  223.             RegParam.sValueName = "Publisher";  
  224.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  225.             reg.Publisher = Convert.ToString(ReturnParam.sValue);  
  226.   
  227.             RegParam.sValueName = "InstallLocation";  
  228.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  229.             reg.InstallLocation = Convert.ToString(ReturnParam.sValue);  
  230.   
  231.             RegParam.sValueName = "InstallDate";  
  232.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  233.             reg.InstallDate = Convert.ToString(ReturnParam.sValue);  
  234.   
  235.             RegParam.sValueName = "DisplayIcon";  
  236.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  237.             reg.DisplayIcon = Convert.ToString(ReturnParam.sValue);  
  238.   
  239.             RegParam.sValueName = "UninstallString";  
  240.             ReturnParam = ObjReg.ExecMethod_(RegMethod.Name, RegParam);  
  241.             reg.UninstallString = Convert.ToString(ReturnParam.sValue);  
  242.   
  243.             return reg;  
  244.         }  
  245.         #endregion  
  246.     }  
  247. }  

6.新建Silverlight项目,添加ZKR.Silverlight.Core的引用;

7.xaml代码如下:

[html] view plaincopy
  1. <navigation:Page x:Class="LogInfoTest.Software"   
  2.            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  3.            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  4.            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
  5.            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
  6.            mc:Ignorable="d"  
  7.            xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"  
  8.            d:DesignWidth="640" d:DesignHeight="480"  
  9.                  xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  
  10.            Title="Software Page">  
  11.     <Grid x:Name="LayoutRoot" Background="White">  
  12.         <TextBlock Text="获取本机已安装软件的列表" FontSize="12" VerticalAlignment="Top" Margin="0,5,0,0" HorizontalAlignment="Left" Width="150" Height="20"></TextBlock>  
  13.         <Button x:Name="btnLoad" Content="读取" Click="btnLoad_Click" Width="50" Height="25" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="160,3,0,0"></Button>  
  14.         <sdk:DataGrid Margin="0,34,0,0" x:Name="DataGrid1" AutoGenerateColumns="False">  
  15.             <sdk:DataGrid.Columns>  
  16.                 <sdk:DataGridTextColumn Binding="{Binding RegName, Mode=TwoWay}" CanUserReorder="False" Header="注册表名称" IsReadOnly="True" />  
  17.                 <sdk:DataGridTextColumn Binding="{Binding DisplayName, Mode=TwoWay}" CanUserReorder="False" Header="软件名称" IsReadOnly="True" />  
  18.                 <sdk:DataGridTextColumn Binding="{Binding DisplayVersion, Mode=TwoWay}" CanUserReorder="False" Header="软件版本" IsReadOnly="True" />  
  19.                 <sdk:DataGridTextColumn Binding="{Binding Publisher, Mode=TwoWay}" CanUserReorder="False" Header="发布者" IsReadOnly="True" />  
  20.                 <sdk:DataGridTextColumn Binding="{Binding InstallLocation, Mode=TwoWay}" CanUserReorder="False" Header="安装目录" IsReadOnly="True" />  
  21.                 <sdk:DataGridTextColumn Binding="{Binding InstallDate, Mode=TwoWay}" CanUserReorder="False" Header="安装时间" IsReadOnly="True" />  
  22.                 <sdk:DataGridTextColumn Binding="{Binding DisplayIcon, Mode=TwoWay}" CanUserReorder="False" Header="运行路径" IsReadOnly="True" />  
  23.                 <sdk:DataGridTextColumn Binding="{Binding UninstallString, Mode=TwoWay}" CanUserReorder="False" Header="卸载路径" IsReadOnly="True" />  
  24.                 <sdk:DataGridTemplateColumn Header="操作">  
  25.                     <sdk:DataGridTemplateColumn.CellTemplate>  
  26.                         <DataTemplate>  
  27.                             <StackPanel Orientation="Horizontal">  
  28.                                 <Button x:Name="btnRun" Content="运行" DataContext="{Binding DisplayIcon}" Click="btnRun_Click" />  
  29.                                 <Button x:Uid="btnUninstall" Content="卸载" DataContext="{Binding UninstallString}" Click="btnUninstall_Click" Margin="5,0,0,0"/>  
  30.                             </StackPanel>  
  31.                         </DataTemplate>  
  32.                     </sdk:DataGridTemplateColumn.CellTemplate>  
  33.                 </sdk:DataGridTemplateColumn>  
  34.             </sdk:DataGrid.Columns>  
  35.         </sdk:DataGrid>  
  36.     </Grid>  
  37. </navigation:Page>  
[html] view plaincopy
  1. 8.xaml.cs代码:  
[html] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Windows;  
  6. using System.Windows.Controls;  
  7. using System.Windows.Documents;  
  8. using System.Windows.Input;  
  9. using System.Windows.Media;  
  10. using System.Windows.Media.Animation;  
  11. using System.Windows.Shapes;  
  12. using System.Windows.Navigation;  
  13.   
  14. using System.Runtime.InteropServices.Automation;  
  15. using ZKR.Silverlight.Core;  
  16. using System.Collections.ObjectModel;  
  17.   
  18. namespace LogInfoTest  
  19. {  
  20.     public partial class Software : Page  
  21.     {  
  22.         public Software()  
  23.         {  
  24.             InitializeComponent();  
  25.         }  
  26.   
  27.         // 当用户导航到此页面时执行。  
  28.         protected override void OnNavigatedTo(NavigationEventArgs e)  
  29.         {  
  30.         }  
  31.   
  32.         private void btnLoad_Click(object sender, RoutedEventArgs e)  
  33.         {  
  34.             this.DataGrid1.ItemsSource = LocalMachine.GetInstallSoftware();  
  35.         }  
  36.   
  37.         private void btnRun_Click(object sender, RoutedEventArgs e)  
  38.         {  
  39.             LocalMachine.RunApplication(((Button)sender).DataContext.ToString());  
  40.         }  
  41.   
  42.         private void btnUninstall_Click(object sender, RoutedEventArgs e)  
  43.         {  
  44.             LocalMachine.UninstallApplication(((Button)sender).DataContext.ToString());  
  45.         }  
  46.     }  
  47. }  

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台