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

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 plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  1. 8.xaml.cs代码:  
[html]  view plain copy
  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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中的原始安装包文件呢   这种错误会令人抓狂 不过 还是有解决方法的:   打开注册表工具regedit 在“开始 >运行”中执行命令regedit 找到路径 My Computer >   HKEY CLASSES ROOT > INSATLLER > PRODUCTS > {D7314F9862C648A4DB8BE2A5B47BE100} 然后删除它(注意 在删除注册表键值之前 请右键点击要删除的键值 通过导出功能来做备份 一旦删除之后发生问题 可以通过双击之前导出的注册表文件进行恢复) 退出注册表工具   再试试安装silverlight或升级 是否成功了 反正我是成功了 祝你也好运   情况二及解决方法:   如果在使用windows update更新时 发现某个更新总是安装失败 并且错误代码是643 那么通常都是由于该更新所对应的组件损坏 导致该更新无法安装成功 要解决这个问题 通常都需要将该组件卸载之后重新安装来进行修复 如果无法安装的更新是Microsoft Silverlight的更新 首先需要做好准备的是下载独立的Microsoft Silverlight安装包   方法一:下载Windows Installer clean up工具并安装 在开始菜单中打开它并找到与silverlight相关的项目 将其删除 完成后重新启动计算机 再次安装Microsoft Silverlight并尝试更新 ">情况一及解决方法:   在升级silverlight 或者卸载的时候 提示找不到某个某个临时目录下的原始安装文件 从而无法卸载或升级新版本 微软公司真是没有考虑周全 谁会保存原始的临时文件目录 通常在某个temp目录中 中 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值