2014年3月2日星期日

[]快速构建Android REST客户端#1 - iMID

本文自动转发自我的博客: http://www.haofengjing.org/?p=1604

日常使用的各种客户端:新浪微博客户端、Google+、Path、人人等,都属于REST App,如何快速的构建REST客户端也成为了近年来Google IO大会上的热门课题,而我在这方面也投入了近一年的经历(从项目经历来看,简直就是客户端专业户了,泪···)。下面我将以最近开发的Driibo(on github)为例,手把手带大家开发REST客户端。


应用架构


网络通讯

原始的HttpClient开发成本较高,最好使用更为先进的库,比如以下这些:

  • Volley Google于2013 Google io大会上发布的网络通讯库,Google Play,Driibo均基于此库构建
  • AsyncHttpClient SonaType的一个开源库,移植到Android平台需要进行一些定制,
  • Retrofit Square的开源库,于Volley相比Retrofit更专注于网络请求和数据解析,贵在专一。

Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求。

使用Volley

下载Volley源码

1
$ git clone https://android.googlesource.com/platform/frameworks/volley  

由于Volley直接提供了源码,我们必须自己build jar包,在Volley项目根目录下执行

1
$ ant jar  

然后将所得的Jar包导入到工程中。

请求队列

为了统一管理请求,我在RequestManager.java中维持了一个请求队列实例。

1  2  3  4  5  6
public static RequestQueue mRequestQueue = newRequestQueue();  private static RequestQueue newRequestQueue() {      RequestQueue requestQueue = new RequestQueue(openCache(), new BasicNetwork(new HurlStack()));      requestQueue.start();      return requestQueue;  }  

值得注意的是,Volley提供了中断特定请求的方法,利用这个特性可以在Activity关闭时中断该页面的请求,节省有限资源的消耗(节流省电,顶Google)。

1  2  3  4  5  6  7  8  9  10  11
// tag是中断请求所需的token  public static void addRequest(Request request, Object tag) {      if (tag != null) {          request.setTag(tag);      }      mRequestQueue.add(request);  }  public static void cancelAll(Object tag) {      mRequestQueue.cancelAll(tag);  }  

构建图片缓存

由于Volley提供了本地缓存,在Driibo中我只需要实现一个内存缓存:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
package com.refactech.driibo.data;  import com.android.volley.toolbox.ImageLoader;  import com.refactech.driibo.util.ImageUtils;  import android.graphics.Bitmap;  import android.support.v4.util.LruCache;  /**   * Created by Issac on 7/19/13.   */  public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {      public BitmapLruCache(int maxSize) {          super(maxSize);      }      @Override      protected int sizeOf(String key, Bitmap bitmap) {          return ImageUtils.getBitmapSize(bitmap);      }      @Override      public Bitmap getBitmap(String url) {          return get(url);      }      @Override      public void putBitmap(String url, Bitmap bitmap) {          put(url, bitmap);      }  }  

Driibo使用了一个全局的BitmapLruCache,取内存阈值的1/3作为图片缓存的大小,这样在界面跳转的时不必释放图片资源,更有效的利用内存并防止OOM:

1  2  3  4  5
 // 取运行内存阈值的1/3作为图片缓存      private static final int MEM_CACHE_SIZE = 1024 * 1024 * ((ActivityManager) AppData.getContext()              .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass() / 3;      private static DiskBasedCache mDiskCache = (DiskBasedCache) mRequestQueue.getCache();  

图片加载

Volley提供了ImageLoader,NetworkImageView用于处理图片加载。其中NetworkImageView主要用于非滚动视图的图片加载,可直接替换ImageView。 对于列表中的图片加载我在Driibo中是这样处理的:

  1. 创建ImageLoader实例
1  2
 private static ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(              MEM_CACHE_SIZE));  
  1. 在ShotsAdapter中加载图片
1  2  3  4  5  6  7  8  9  10  11  12  13
  @Override      public void bindView(View view, Context context, Cursor cursor) {          Holder holder = getHolder(view);          if (holder.imageRequest != null) {              holder.imageRequest.cancelRequest();          }          ...          Shot shot = Shot.fromCursor(cursor);          holder.imageRequest = RequestManager.loadImage(shot.getImage_url(), RequestManager                  .getImageListener(holder.image, mDefaultImageDrawable, mDefaultImageDrawable));  ...  }  

必须保存请求实例,并在列表滚动时取消上次的请求,以防止列表中图片加载错乱的情况。

Be Careful: 切不可在列表中混用NetworkImageViewImageLoader,否则会出现图像无法加载的情况,原因未查证。。。


相关演讲


[]消息称乌海军护卫舰叛逃俄罗斯 目前正前往黑海_这是好莱坞大片的情节吗

本文自动转发自我的博客: http://www.haofengjing.org/?p=1602

消息称乌海军护卫舰叛逃俄罗斯 目前正前往黑海 乌海军旗舰Hetman Sahaidachny护卫舰

今日俄罗斯(RT)网站1日援引报道,乌海军旗舰Hetman Sahaidachny护卫舰挂起圣安德烈旗,脱离基辅指挥,叛逃俄罗斯。此前该舰在亚丁湾参加北约军演。

据俄罗斯参议员Igor Morozov表示,乌克兰海军这艘护卫舰已经投向了俄罗斯的怀抱,"目前该舰正在从地中海返回黑海,船员已完成了乌克兰武装力量指挥官亚努科维奇的命令。"

叛逃事件发生在周五乌克兰海军指挥官辞职之后,新政府代总统图尔奇诺夫任命了新的海军统帅。

据基辅时报报道,乌克兰新总理亚采纽克要求土耳其官方不要放该护卫舰通过博斯普鲁斯海峡,称船长违背了基辅政府发出的指令。


2014年3月1日星期六

[]Dropbox独树一帜的十大利器

本文自动转发自我的博客: http://www.haofengjing.org/?p=1600
DropBox虽然国外面临着有亚马逊、微软OneDrive、Google drive等强大竞争对手,国内的新浪微盘、360云盘、百度云、115网盘、金山云、酷盘、华为网盘等,也让国内云存储市场也异常火热。此番Dropbox入华为什么能这么火,到底有什么过人之处,几天小编结合自身的感受,从产品体验的角度去简单分析总结一下。 1.非常稳定。程序稳定不出现错误和崩溃。速度稳定,连接服务器一直很稳定。反观国内的一些网盘客户端经常莫名其妙的崩溃,用户体验非常不好。 2.安全保障。国内的网盘同步工具很容易因为运营不善挂掉,比如说前几年的迅雷5G网盘。而Dropbox从08年开始创建,运营一直良好,公司实力雄厚,最近估值更是达到了100亿美元,用户完全不用担心突然挂掉。 3.多平台云同步。Dropbox是最早支持也是覆盖最全面各大平台的,而其他的软件做不到。我一般在家里和公司使用,偶尔手机使用。 4.版本控制。应该是dropbox很大的一个特色,免费用户可以回溯30天的版本。非常贴心的功能,尤其是对于存储重要工作文档的用户。 5.增量同步。当用户Dropbox文件夹中的文件发生变化后,Dropbox只上传改变的文件部分,并实施同步。所以dropbox的同步速度很棒,对了解svn的用户来讲这个功能很贴心。 6.简洁无干扰。Dropbox安装好之后就静静在后台处理,不会干扰用户的任何工作,老老实实办事儿,很低调,而不像国内其他软件老是主动弹出干扰。 7.外链分享。非常方便的分享规则,只需要右键点击文件和文件夹就可以任意分享。一分部用户省去了建立FTP服务器的麻烦,细心的用户甚至可以利用这一功能搭建自己的静态网站。 8.协同工作。可以设定一个文件夹供多人一起协作,我一直用这个功能和同事共享文档和同步工作内容。 9.丰富的API。利用Dropbox提供的API有很多强大的功能,比如把重要的Gmail附件自动备份到Dropbox,比如备份Facebook的加星照片,比如自动定期备份网站源文件到Dropbox。 10.土豪的慷慨。用户可以通过各种方法把免费空间提升至20G。 通过Dropbox独树一帜的十大利器_DOIT.com.cn.

[]貌似是内讧了---格鲁吉亚前总统萨卡什维利涉谋杀前总理

本文自动转发自我的博客: http://www.haofengjing.org/?p=1597
格鲁吉亚"玫瑰革命"领导人、卸任总统萨卡什维利,几天前还在基辅广场为乌克兰反对派加油打气,但到了2月26日,格媒体却曝出其涉嫌谋杀前总理日瓦尼亚的消息。这让萨卡什维利本已规划好的"美好未来"蒙上阴影,他期待中的"美国梦"也可能因此泡汤。   前总统涉嫌谋杀前总理   格鲁吉亚报纸《Asaval-Dasavali》2月26日载文称,前总理祖拉布·日瓦尼亚死亡案调查结束,总检察院查明,前总统萨卡什维利涉嫌参与谋杀。报道说,这一消息是总检察院一名消息人士提供的。文章说,"从检方掌握的一份秘密录音带中,可听到萨卡什维利本人说:现在把尸体弄走,按照商量好的那样做"。该报道指出,"日瓦尼亚是在总统宫邸被杀的,当时萨卡什维利和时任内务部长梅拉比什维利在场。日瓦尼亚的尸体被装入电视机包装箱,随后被运到他位于第比利斯市内的住宅,并在那里制造了日瓦尼亚'煤气中毒死亡'的现场"。   目前,格鲁吉亚检察院没有对此报道发表评论。   在著名的2003年格鲁吉亚"玫瑰革命"中,日瓦尼亚是反对派领导人之一,与布尔贾纳泽和萨卡什维利并称为"玫瑰革命"的"铁三角"。日瓦尼亚在"玫瑰革命"中起到了举足轻重的作用,当时他领导的反对派势力最为强大。2003年11月,日瓦尼亚和反对派领袖萨卡什维利结成联盟,以当局在议会选举中"舞弊"为由,拒绝承认选举结果,进而引发局势动荡。2003年11月22日,格反对派率领示威者冲进国会,要求当时的总统谢瓦尔德纳泽辞职,一名反对派手上还挥舞着象征和平的红玫瑰。反对派"逼宫"成功,谢瓦尔德纳泽黯然下台。11月27日,格议会举行非常会议,决定由日瓦尼亚担任政府国务部长。2004年2月9日,当选总统萨卡什维利任命日瓦尼亚为总理。   日瓦尼亚"意外死亡"疑点多   2005年2月3日凌晨,日瓦尼亚被发现死于一处秘密租赁的房屋内,和他一起被发现死亡的,还有克维莫-卡尔特里大区副州长劳尔·尤苏波夫。当日,时任格内务部长瓦诺·梅拉比什维利举行紧急新闻发布会,宣布日瓦尼亚死于天然气中毒。   当时,格鲁吉亚高加索通讯社援引梅拉比什维利的话报道说,2月3日零时许,日瓦尼亚前往其朋友尤苏波夫在第比利斯的住宅。凌晨4时左右,警卫人员听到总理房间里的电话铃声不断却无人接听,于是便撬开窗子察看,发现日瓦尼亚和乌苏波夫已经死亡。日瓦尼亚坐在椅子上,尤乌苏波夫则躺倒在厨房里。梅拉比什维利说,这是一起意外事故,可以排除谋杀可能。有可能是屋内的天然气取暖系统发生了泄漏,日瓦尼亚等二人很可能死于天然气中毒。   梅拉比什维利当时介绍说,日瓦尼亚及乌苏波夫的遗体都被送到尸检部门,格国家法医局负责人列万·齐楚阿在尸检后说,法医检查结果表明,现场没有任何暴力迹象,日瓦尼亚和乌苏波夫都是死于天然气中毒。   据俄《消息报》此前的报道称,日瓦尼亚的弟弟乔治·日瓦尼亚当时在接受媒体采访时曾明确指出,日瓦尼亚的死亡现场有多个疑点有待澄清。这些疑点包括:根据对现场的司法鉴定,查遍整个出租屋,并没有发现这两名死者留下的任何指纹,即便是在桌上两个已喝过橘子汁的玻璃杯上,也未找到死者的指纹;出租屋的桌子上放着许多香肠,但据家人回忆,日瓦尼亚那段时间正在减肥,根本不会食用油腻食品;现场发现31个烟蒂,但仅有一个符合日瓦尼亚的吸烟习惯,因为日瓦尼亚一般吸烟到一半长度就会将其掐灭;日瓦尼亚当晚在母亲家中接到一个神秘电话后出门,令人奇怪的是,在他的好友尤苏波夫的手机上确实留下了与日瓦尼亚的通话记录,但记录上显示的这个电话号码,却是日瓦尼亚早在两年前便已停用了的旧号码。   乔治·日瓦尼亚对媒体说:"我曾经多次提醒祖拉布提防别人暗害,因为那段时间他树敌太多。但是他显然压根儿没把我的话当回事。"   格新政府重查日瓦尼亚死亡案   2012年10月,时任总统萨卡什维利领导的"统一民族运动"党,在议会选举中输给了伊万尼什维利领导的反对派联盟"格鲁吉亚梦想",伊万尼什维利组阁任总理。在2013年10月的总统选举中,"格鲁吉亚梦想"联盟推举的候选人格奥尔基·马尔格韦拉什维利当选,11月17日萨卡什维利总统任期到期离任。格新政府执政后,立即着手调查萨卡什维利时代的"弊案",包括重新调查日瓦尼亚"意外死亡"案件。   今年2月17日,格鲁吉亚库塔伊希市法院以挪用公款和滥用职权等罪名,判处前总理、内务部长梅拉比什维利5年零6个月监禁。法院认定,梅拉比什维利在2012年议会选举前动用国库资金给执政党支持者发工资。另外,他还以不正当手段获取一幢别墅,并用公款作为该别墅的维护费。   外界尤为关注的是,当时负责调查日瓦尼亚死亡案件的人,正是梅拉比什维利,在这桩案件的调查中是否存在"黑幕"?分析人士称,如果媒体报道的"前总统萨卡什维利涉嫌谋杀日瓦尼亚"属实,那么,梅拉比什维利很可能也是知情人,至少涉嫌隐匿证据、包庇真正的犯罪嫌疑人。因为,梅拉比什维利是萨卡什维利的铁杆盟友,在萨卡什维利任总统期间曾先后出任内务部长和总理,并曾担任萨卡什维利所在的执政党"统一民族运动"的总书记。尤其是,梅拉比什维利自2004年12月至2012年6月一直担任萨卡什维利政府的内政部长,他对萨卡什维利的"秘密"应该十分清楚。   萨卡什维利恐难走出国门   去年11月8日,美国驻第比利斯前大使肯涅特·雅洛维茨在华盛顿伍德罗·威尔逊国际学者中心发表演讲中时曾表示,萨卡什维利在卸任总统之后,在国外开展活动将更好一些。雅洛维茨认为,格鲁吉亚社会和一些政党将向新总统伊万尼什维利施加压力,要求政府对萨卡什维利恢复"所谓的公正性"。雅洛维茨说:"萨卡什维利一旦受审,将会引起国家分化,导致人民走上街头。如果审判前总统,美国和西方将对此持不良看法。对格鲁吉亚前总统来说,最佳方案是离开格鲁吉亚,去美国或欧洲从事学术活动。"   去年年底,美国弗莱彻法律与外交学院网站公布消息称,从2014年春季学期开始,格鲁吉亚卸任总统萨卡什维利将在该校开设欧洲国家史讲座,课程内容重点是"现代主题"。该校公告称,"萨卡什维利是著名的政治家,其最大的成就是改写了自己国家的历史、并使其回归西方怀抱"。弗莱彻法律与外交学院是美国塔夫茨大学的下属学院。   几天前的2月23日,乌克兰反对派掌权后,萨卡什维利在接受电视采访时称:"他们(乌克兰新政府)提出了令我难以置信的建议,包括让我去乌克兰出任正式的高层职位,但我没有这样的计划。"萨卡什维利说:"我的心在乌克兰,但我是格鲁吉亚人。"萨卡什维利此前在接受乌克兰媒体采访时也曾明确表示,他卸任后将去美国几所大学工作,重点研究格鲁吉亚的改革计划,"已有几所美国著名大学向其提供了待遇优厚和严肃的邀请"。   分析人士认为,现在看来,萨卡什维利的美国之行恐难实现。执政联盟"格鲁吉亚梦想"掌权后,萨卡什维利领导的"统一民族运动"党很多高官很快就被追究刑事责任,萨卡什维利很可能会因挥霍预算资金和2008年南奥塞梯战争等案而被审讯。再加上刚刚爆出的"日瓦尼亚死于谋杀"的消息,萨卡什维利很可能被追究刑事责任。原总检察长克比拉什维利明确表示,格检察院与美国联邦调查局正在联合调查日瓦尼亚案件,不排除传唤萨卡什维利的可能。去年底,原总理伊万尼什维利在会见媒体代表时也表示:"对以前发生的凶杀案的调查仍在继续。我没有打算消灭谁,或者把总统送进监狱变成囚犯,不过,社会将有机会确保所有有罪的人都要为自己的行为承担责任。剩下的一切,就是调查部门的事情了。"

2014年2月28日星期五

[][C#] 利用 WMI 控制 远程/本端 计算机 -- 以关机为例

本文自动转发自我的博客: http://www.haofengjing.org/?p=1596
=================================== * 问题描述 * =================================== 如何使用 WMI 达到 远程 及 本端计算机的控制 ( 重新启动及关机 ) =================================== * 范例程序 — 示意图 * =================================== =================================== * 范例程序 — 程序代码 * =================================== //====================================== // 本程序制作 : Nobel12 ( 轧延油 ) // 程序解说网址 : http://www.wretch.cc/blog/nobel12 // 制作日期: 2009/06/22 // 相关参考网址:[ 下方格式 >>> 网站名称 , 文章主题 , 引用网址 ] // * 制作起源: .NET菜鸟自救会, [C#]取得CPU温度 , http://www.dotblogs.com.tw/chou/archive/2009/06/21/8927.aspx // 参考网址1: MSDN, ManagementObjectSearcher 成员 , http://msdn.microsoft.com/zh-tw/library/system.management.managementobjectsearcher_members.aspx // 参考网址2: 强力鎯头 の VB 部落 , C# 透过 WMI 控制计算机重新启动 , http://itgroup.blueshop.com.tw/HammerChou/PowerHammer?n=convew&i=2408 // 参考网址3: 开发者在线 - www.builder.com.cn , Visual C#中用WMI控制远程计算机 , http://www.builder.com.cn/2007/1111/624415.shtml // 参考网址4: MSDN 社群论坛 , 使用WMI操控远程计算机联机失败 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/d8606179-f6c3-4516-9a2e-9711b0d08642 // 参考网址5: MSDN 社群论坛 , WMI远程计算机的ConnectionOptions类别的疑问 , http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/dd06d6a3-f16a-4409-a01b-143e85294da8 //====================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; // 请先加入参考 System.Management,再加入 using System.Management using System.Management; namespace FrmWMISample { public partial class FrmRebootbyWMI : Form { public FrmRebootbyWMI() { InitializeComponent(); } // 本机端部份 private void btnLocalReboot_Click(object sender, EventArgs e) { // 使用 ManagementClass 类别 --> 表示 CIM (通用信息模型) 管理类别, 管理类别是指 WMI 类别, // 关于 CIM 可参考: http://technet.microsoft.com/zh-tw/library/aa998751.aspx ManagementClass mc_os = new ManagementClass("Win32_OperatingSystem"); // ConnectionOptions.EnablePrivileges 属性 : 指出是否需要为连接作业启用用户权力。 **(特一) // 如果需要为连接作业启用用户权力,应为 true,否则为 false。默认值为 false。 // 执行的作业需要启用某些用户权力时 (如,计算机重新启动) 应该使用这个属性。 mc_os.Scope.Options.EnablePrivileges = true; // 透过 foreach 语句把集合体中之元素分别取出 foreach (ManagementObject mo in mc_os.GetInstances()) { // 使用 InvokeMethod 方法叫用 重新启动 mo.InvokeMethod("Reboot", null, null); } // 释放资源 mc_os.Dispose(); } // 可指定远程计算机部份 private void btnRemoteExecute_Click(object sender, EventArgs e) { // 确立 WMI 运作范围 // 使用 ConnectionOptions 类别对象来设定关连线设定 ConnectionOptions options = new ConnectionOptions ( ) ; options.Username = txtUsername.Text ; // 使用者名称 options.Password = txtPassword.Text ; // 用户密码 options.Authentication = AuthenticationLevel.Default; // 认证模式设定 (采用默认) options.Impersonation = ImpersonationLevel.Impersonate; // 设定 COM 仿真等级 options.EnablePrivileges = true; // 参考 **(特一) //options.Authority = "ntdlmdomain:DOMAIN"; try { // 使用 ManagementScope 类别 ManagementScope MS_Conn = new ManagementScope("\\\\" + txtName.Text + "\\root\\cimv2", options); MS_Conn.Connect(); // 建立 WMI 查询条件 ( 此类 SQL 语法 ) // 可参考 : [以下格式 : 文章名称 , 引用网址 ] // WMI脚本高手不完全手册 , http://forum.slime.com.tw/thread170813.html // .net中的WMI编程(一):WMI介绍及简单应用 , http://soft.zdnet.com.cn/software_zone/2008/0114/708068.shtml ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher mos1 = new ManagementObjectSearcher(MS_Conn, oq); ManagementObjectCollection moc1 = mos1.Get(); foreach (ManagementObject mo in moc1) { if (comboBox1.Text =="重新启动") { mo.InvokeMethod ( "Reboot" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已重新启动...", txtName.Text)); } else if ( comboBox1.Text =="关机") { mo.InvokeMethod ( "Shutdown" , null ) ; MessageBox.Show(string.Format("计算机: {0} 已关机...", txtName.Text)); } else { MessageBox.Show("例外错误!!!"); } } } catch ( Exception err1 ) { MessageBox.Show ( "与 " + txtName.Text + " 联机错误,错误讯息为:" + err1.Message ) ; } } private void FrmRebootbyWMI_Load(object sender, EventArgs e) { comboBox1.SelectedIndex = 0; } } }

[]C#中操作WMI的类库-实现远程登录共享

本文自动转发自我的博客: http://www.haofengjing.org/?p=1595

WMI是Windows Management Instrumentation的简称,即:视窗管理规范。在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件。通过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就像操作本地机一样方便、简单。

  一.WMI简介 
  WMI从根本上说应该为一种服务,并且对于本地不同的用户,WMI所有的权限也不一样。计算机超级用户可以为计算机中的每一个用户,设定不同的WMI权限。在默认状态下,超级用户拥有WMI的一切权限。提供WMI服务是通过程序"WinMgmt.exe"来实现的。可以从"System32\Wbem"目录中找到这个文件。

  既然是服务,计算机使用者就可以享受这种服务,同样也可以关闭这种服务。具体的操作是:按顺序打开【控制面板】|【管理工具】|【组件服务】。WMI服务在组件服务中的显示名称为"Windows Management Instrumentation"。具体如下图01所示:

VisualC#中用WMI编写网络应用程序
图01:组件服务窗口


  选中【名称】栏中"Windows Management Instrumentation",点击鼠标右键,在弹出的菜单中,选择【属性】,在【启动类型】选择框中选择"已禁用",然后在单击【停止】按钮,这样本地的WMI服务也就被关闭了。此时所有本地和远程的WMI调用均为非法。下图为关闭WMI服务后的界面:

VisualC#中用WMI编写网络应用程序
关闭WMI服务


  计算机的超级用户在默认状态下拥有WMI的一切权限,并且可以为本地其他用户设置WMI权限。具体操作是,按顺序打开:【控制面板】|【管理工具】|【计算机管理】。选中【计算机管理】右边的【服务和应用程序】中的【WMI控件】。具体如图02所示:

VisualC#中用WMI编写网络应用程序
图02:【计算机管理】对话框


  点击鼠标右键,在弹出的菜单中,选择【属性】。弹出【WMI控件属性】对话框中,选择【安全】页面。具体如图03所示:

VisualC#中用WMI编写网络应用程序
图03: 打开WMI安全设置界面


  单击图9-4中【安全设置】按钮,弹出【安全设置Root】对话框,通过其中的【添加】和【删除】按钮,可以设定本地有哪些用户拥有WMI权限,并通过【权限】选择栏为每一个用户设置不同的权限,具体如图04所示:

VisualC#中用WMI编写网络应用程序
图04:设定本地用户的WMI权限


  通过上图,也可以发现计算机超级用户在默认状态的WMI权限都是允许的,并且这些权限都是无法删除的。


二.Visual C#中操作WMI的类库简介
  .Net FrameWork SDK对WMI提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI提供了一个专门的命名空间"System.Management"。在命名空间"System.Management"中提供了大量用以处理和WMI相关的类、接口和枚举。

  命名空间"System.Management"中的成员是非常复杂的,由于篇幅所限完全介绍这些成员是不可能的,也是没有要的。根据我的经验,认为要了解、掌握在Visual C#中使用WMI,下面六个类应该是学习的重点,分别是ConnectionOptions、ManagementScope、ObjectQuery、ManagementObjectSearcher、ManagementObjectCollection和ManagementObject。下面就简单介绍一下六个类:

  ·ConnectionOptions类

  ConnectionOptions类主要的功能是为建立的WMI连接提供所需的所有设置。在利用WMI对远程计算机进行操作的时候,首先要进行WMI连接,WMI连接主要是使用的是ManagementScope 类,成功完成WMI连接就要提供远程计算机WMI用户名和口令。ConnectionOptions类可以通过其属性来提供这些信息。表01是ConnectionOptions类的一些主要属性及其简单的说明。

属性 说明
Authority 获取或设置将用于验证指定用户的权利。
Locale 获取或设置将用于连接操作的区域设置。
Password 提供用于WMI连接操作的口令。
Username 提供用于WMI连接操作的用户名。

     表01:ConnectionOptions类常用属性及其说明

  其中最常用的属性是Password和Username。

  ·ManagementScope 类

  通过ManagementScope类能够建立和远程计算机(或者本地计算机)的WMI连接,表示管理可操作范围。创建WMI连接可以通过二种方法:

  ( 1 ) . 利用构造函数,当使用下面构造函数初始化ManagementScope 类实例,同时也就建立了WMI连接,具体如下:

public ManagementScope (  string path , ConnectionOptions options ) ;


  参数:

  path ManagementScope的服务器和命名空间。 

  options 包含有关连接的选项的 ConnectionOptions。

  使用构造函数是有风险的,因为如果不能根据提供的选项建立WMI连接,程序会程序异常,出现错误。 

  下列代码是利用此构造函数构建建立ManagementScope实例,并建立于远程计算机majinhu的WMI连接:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2", Conn ) ;


  ( 2 ) . 利用ManagementScope中提供的Connect方法:

  ManagementScope中的成员是非常少的,最常用的方法和属性各一个:常用属性是Options,主要为WMI建立提供参数;常用方法是Connect,通过它可以建立于远程计算机的WMI连接。下列是利用Connect方法建立WMI连接的具体代码:

System.Management.ConnectionOptions Conn = new ConnectionOptions ( ) ; //设定用于WMI连接操作的用户名 Conn.Username = "WMI用户名"; //设定用户的口令 Conn.Password = "此用户名对应口令"; System.Management.ManagementScope Ms = new ManagementScope("\\majinhu\root\cimv2" ) ; Ms.Options = Conn ; Ms.Connect ( ) ; //建立WMI连接


  ·ObjectQuery类

  ObjectQuery类或其派生类用于在ManagementObjectSearcher中指定查询。程序中一般采用查询字符串来构造ObjectQuery实例。其中的查询字符串是一种类似SQL语言的WQL语言。下面的ObjectQuery类构造函数中最常见的一种,具体语法如下:

public ObjectQuery ( string query ) ;


  参数:

  query 查询的字符串

  ·ManagementObjectSearcher类

  ManagementObjectSearcher主要是根据指定的查询检索WMI对象的集合。ManagementObjectSearcher组成成员也非常简单,其方法Get方法是非常重要的,ManagementObjectSearcher通过Get方法进行WMI查询,并把得到的结果集合。Get方法的返回值是一个ManagementObjectCollection实例,它包含匹配指定查询的对象。

  表02是其ManagementObjectSearcher类的常用属性及其说明。

属性 说明
Options 有关如何搜索对象的选项
Query 在搜索器中调用的查询
Scope 在其中查找对象的范围

      表02:ManagementObjectSearcher类常用属性及其说明

  ·ManagementObjectCollection类

  ManagementObjectCollection类非常简单,它主要表示 WMI 实例的不同集合其中包括命名空间、范围和查询观察程序等。创建ManagementObjectCollection类没有构造函数。

  ·ManagementObject类

  ManagementObject类为单个管理对象或类。通过ManagementObject中的方法可以调用ManagementObject对应的对象,从而执行相应的操作。ManagementObject类是一个内容丰富的类,表03和表04分别是其常用的属性和方法。

属性 说明
ClassPath 对象的类的路径。
Options 检索对象时要使用的其他信息。
Path 对象的 WMI 路径。
Scope 此对象在其中驻留的范围。

       表03:ManagementObject类常用属性及其说明

方法 说明
Clone 创建对象的一个副本。
CopyTo 将对象复制到另一个位置。
Delete 删除对象。
Get 绑定到管理对象。
GetRelated 获取与该对象(联系对象)相关的对象的集合。
GetRelationships 获取该对象的关联的集合。
InvokeMethod 调用对应的对象方法。
Put 提交对对象所做的更改。

      表04:ManagementObject类常用方法及其说明

  下面就结合二个具体的示例来介绍Visual C#中利用上述类,提供WMI掌握如何利用WMI编写网络应用程序,所使用的类库主要是使用了上面接收的这六个类。

例子:

复制代码
 1            ConnectionOptions conOptions=new ConnectionOptions();   2             conOptions.Username = "Administrator";   3             conOptions.Password="Abc123";   4             conOptions.Impersonation = ImpersonationLevel.Impersonate;   5             conOptions.EnablePrivileges = true;   6             ManagementScope ms = new ManagementScope("\\\\192.168.11.21\\root\\cimv2", conOptions);   7             try   8             {   9                 ms.Connect();  10                 FileStream fWrite = File.Create("\\\\192.168.11.21\\test\\te.txt");  11             }  12             catch (Exception)  13             {  14                 throw;  15             }
复制代码


[]Wordpress安装百度统计方法

本文自动转发自我的博客: http://www.haofengjing.org/?p=1594
  首先在百度统计获取安装代码,在后台文件中查找 wp-content/themes/footer.php 文件,然后打开,将百度统计代码复制粘贴到页尾<body>的前面,保存并更新文件。