AppleSeeker's Tech Blog
Welcome to AppleSeeker's space
posts - 40,  comments - 359,  trackbacks - 2

前几天写过关于Vista下防火墙的设置,今天觉得防火墙都有对应的API,那自动更新是否有相应的API呢?Vista下的与Xp下的有多少不同呢?带着这个疑问开始一天的调查。

查了很多资料找到要操作Windows Update必须经由Windows Update Agent(WUA)。
在Vista和Xp下,该wuapi.dll都能找到(Windows\System32下),奇怪的是,Vista下该dll的版本是6.0,而Xp下是5.8,不知道改动点在哪里,粗略查看了里面的主要的类,发现并没改动什么,难道只是内部函数的调整?

要操作Windows Update相应类,必须了解他们之间的关系,如图所示:

从上图不难发现,AutomaticUpdatesClass只是自动更新的设置类,关于所有自动更新的类都通过UpdateSessionClass。

取得自动更新的所有设置,以及如何改变设置:
通过实例化一个AutomaticUpdatesClass类,然后访问它的Settings属性,该属性中:
NotificationLevel:自动更新的动作(自动/无效/通知后下载/下载后通知),枚举类型
ScheduledInstallationDay:自动下载是每星期几(从星期一到星期天),枚举类型
ScheduledInstallationTime:自动下载的时间(从0点到23点)

可以直接修改
AutomaticUpdatesNotificationLevel属性以及ScheduledInstallationDay和ScheduledInstallationTime
设置完后调用IAutomaticUpdatesSettings的Save方法。
IAutomaticUpdatesSettings实例通过AutomaticUpdatesClass对象的Settings属性获得。

在该AutomaticUpdatesClass类中,可以调用EnableService方法启动自动更新服务,只有当自动更新服务启动后,通过读取自动更新设置,来从MS网站获取更新内容。通常情况下,自动更新服务都是设置为自动启动。

当然你也可以通过程序启动,该服务启动后,自动设为自动启动(无论你原先是手动还是无效),MS没有提供方法将该服务停止关闭。

当服务启动后,可以使用下面3个方法:
DetectNow:开始更新
Pause:暂停更新
Resume:恢复更新

参考代码:

 1        public static void AutoUpdateSetting()
 2        {
 3            System.Console.WriteLine("AutoUpdate Imformation:");
 4
 5            WUApiLib.AutomaticUpdatesClass updateCls = new WUApiLib.AutomaticUpdatesClass();
 6
 7            //Show Update Dialog:
 8            updateCls.ShowSettingsDialog();
 9
10            WUApiLib.IAutomaticUpdatesSettings upSettings = updateCls.Settings;
11
12            //Show Update Setting -- Notification Level
13            // aunlNotConfigured = 0
14            // aunlDisabled = 1
15            // aunlNotifyBeforeDownload = 2
16            // aunlNotifyBeforeInstallation = 3
17            // aunlScheduledInstallation = 4
18            System.Console.WriteLine("Notification Level : {0}", upSettings.NotificationLevel.ToString());
19
20            if( upSettings.NotificationLevel == WUApiLib.AutomaticUpdatesNotificationLevel.aunlScheduledInstallation )
21            {
22                // ScheduledInstallationDay:
23                // ausidEveryDay = 0,
24                // ausidEverySunday = 1,
25                // ausidEveryMonday = 2,
26                // ausidEveryTuesday = 3,
27                // ausidEveryWednesday = 4,
28                // ausidEveryThursday = 5,
29                // ausidEveryFriday = 6,
30                // ausidEverySaturday = 7,
31
32                // ScheduledInstallationTime: 0 - 23
33                System.Console.WriteLine("Update Schedule Time : {0} , {1}"
34                        upSettings.ScheduledInstallationDay.ToString(), 
35                        upSettings.ScheduledInstallationTime.ToString());
36            }

37
38            upSettings.NotificationLevel = WUApiLib.AutomaticUpdatesNotificationLevel.aunlNotifyBeforeDownload;
39            upSettings.Save();
40
41            if( updateCls.ServiceEnabled )
42            {
43                System.Console.WriteLine("Update Service state : {0}", updateCls.ServiceEnabled.ToString());
44                //updateCls.EnableService();
45                System.Console.WriteLine("DetectNow");
46                updateCls.DetectNow();
47                
48                Thread.Sleep(10000);
49                System.Console.WriteLine("Pause");
50                updateCls.Pause();
51                
52                Thread.Sleep(10000);
53                System.Console.WriteLine("Resume");
54                updateCls.Resume();
55            }

56
57            System.Console.WriteLine();
58        }

大家都知道控制面板中的自动更新的设置是没有代理选项的,那到底自动更新支持代理吗?
当然支持,自动更新会根据IE浏览器中的代理设置连接,但是当代理服务器需要用户名和密码呢?
这样只能通过程序来设置了。UpdateSessionClass类就提供该功能。

实例化该类后,通过访问该类的WebProxy属性得到WebProxyClass类的实例。
可以设置WebProxyClass类的二个属性,并调用一个方法即可。
Address:代理的地址
UserName:用户名
SetPassword(string strPassword):设置密码

参考代码:
 1public static void AutoUpdateSession()
 2{
 3    WUApiLib.UpdateSessionClass upSessCls = new WUApiLib.UpdateSessionClass();
 4    
 5    System.Console.WriteLine("Update Session : {0}", upSessCls.ClientApplicationID);
 6    
 7    WUApiLib.WebProxyClass webProxy = (WUApiLib.WebProxyClass)upSessCls.WebProxy;
 8
 9    webProxy.Address = @"*********";
10    webProxy.UserName = "*******";
11    webProxy.SetPassword("******");
12
13    System.Console.WriteLine("WebProxy Address : {0}", webProxy.Address);
14    System.Console.WriteLine("WebProxy AutoDetect : {0}", webProxy.AutoDetect);
15    System.Console.WriteLine("WebProxy UserName : {0}", webProxy.UserName);
16}

当我调查到这里的时候,想做一个软件,可以自己来实现更多的操作,对自动更新来说。
大家有什么好的想法,可以告诉我,谢谢~~~。

文中有错误的地方,希望指正。

国内没有好的这方面的资料,可以参考MS的MSDN。
参考:
Interfaces (Windows)
Using the Windows Update Agent API (Windows)
Windows Update Agent Object Model (Windows)
posted on 2007-07-13 16:43 AppleSeeker 阅读(4984) 评论(23)  编辑 收藏 所属分类: .Net

FeedBack:
2007-07-14 01:54 | Join miao      
真不错~学习。。
  回复  引用  查看    
2007-07-14 09:31 | 巫云      
厉害啊,以后什么都可以写程序控制了。
  回复  引用  查看    
#3楼 [楼主]
2007-07-14 11:13 | appleseeker      
@巫云
确实,MS现在在操作系统中的很多功能都能通过其DLL进行扩充改造。这个自动更新的DLL中,在UpdateSessionClass以上的所有类中的方法都是virtual,你可以继承并重写相应的功能。
  回复  引用  查看    
2007-07-15 13:02 | 游戏学院 [未注册用户]
2007年7月15日,是chinajoy在上海开展的最后一天,同时也是允许公众入场的最后一天和最火暴的一天。]


展会刚刚开始,马上就拥入了大量的游戏玩家,大家的兴致都非常高。而游戏学院精彩的活动,丰富的内容,还有精美的礼品成功推广之后决定再接再厉,为本来就很热闹的chinajoy再添一把火!


收获简单归结如下:


1.玩家表现积极,校区上下忙得不亦乐乎。
三校区印制了大量精美的宣传单页在会场中分发,很多玩家对游戏学院表现出非常大的热情,积极询问在展会中刚刚看到的那些电影特技和游戏特效的制作过程。学校的老师耐心的为他们详细的解说,很多玩家围住校长询问游戏学院的成长以及今后的发展,并表现出了想让自己的爱好变成终身职业的愿望。因为询问人数较多,几位校长忙的可真是不亦乐乎。

2.众厂商力捧游戏学院,愿意与游戏学院产生战略合作伙伴关系。
游戏学院参加chinajoy展会并不仅仅只吸引了玩家的关注,大量游戏厂商也对游戏学院产生了浓厚的兴趣,很多游戏厂商来到游戏学院上海三校区的展台与校区领导亲切攀谈,表示出愿意与游戏学院合作的意愿。有很多曾经和游戏学院建立过合作关系的厂商,再次表示愿意跟游戏学院保持长期合作伙伴的关系。

游戏学院-虹口中心欢迎您!

详请咨询请致电:

校 区 电 话:021-65600011/65176308(咨询老师人工接听)

QQ 在线咨询:491016363

Email咨询:shgamecollege@gmail.com【即时回复】

上海游戏学院网址:www.shgamecollege.com

校 区 地 址:汶水东路51号联合数字内容产业园6楼A区(3号线大柏树1号出口向东500米)

  回复  引用    
2007-07-17 16:25 | 天使 [未注册用户]
不错啊,我是新手啊教教我啊
  回复  引用    
2007-07-17 16:31 | 天使 [未注册用户]
不错不错,but~~
你去当电脑专家可以.........
  回复  引用    
2007-07-17 17:55 | huangkit [未注册用户]
lz,我想知道你借助啥工具可以查看系统的DLL文件?
  回复  引用    
#8楼 [楼主]
2007-07-18 09:15 | appleseeker      
@huangkit
查看系统DLL,是指什么?我不是很明白你的意思。
  回复  引用  查看    
2007-07-18 14:27 | gerdy [未注册用户]
我知道楼上*2的意思..他的意思是怎么查看DLL文件里面的"类,函数,接口什么的"的..难道是PE??我也不懂..同问..
  回复  引用    
#10楼 [楼主]
2007-07-18 15:08 | appleseeker      
将DLL添加到项目工程,在引用中,点击该命名空间,会出现object view,在那里可以看DLL的类,函数,接口,属性等。
  回复  引用  查看    
2007-08-20 10:04 | 飞天名猪      
Hi
最近我也在研究这方面的内容,我是在VC6.0的环境下开发
#include了MSDN上给的wuapi的头文件,但是却不知道怎样才能象C#里面那样实例化api中的对象。
WUApiLib.AutomaticUpdatesClass updateCls = new WUApiLib.AutomaticUpdatesClass();
  回复  引用  查看    
#12楼 [楼主]
2007-08-20 16:46 | appleseeker      
@飞天名猪
不好意思,我不知道在vc下如何开发该内容,但我帮你找了个资料,希望对你有帮助。
http://www.codeproject.com/install/whotfixcheck2.asp
可以下载他的源代码参考。
  回复  引用  查看    
2007-08-21 15:11 | 飞天名猪      
@appleseeker
TKS
我看了一下你的代码,有几个疑问
1、IUpdateDownloader补丁启动下载以后,存放在什么目录?
2、我用 IupdateSearcher找出来的IUpdateCollection里面的补丁路径全都是空的,爆汗~~~好象貌似我找出来49个未装补丁只有一个有下载路径
不知道是不是MS自己把路径藏起来了

3、介绍IUpdateSearcher的那篇文章中参数好象不太对,
搜索未安装的软件补丁,参数应该是

"Type='Software' AND IsInstalled=0"
  回复  引用  查看    
#14楼 [楼主]
2007-08-21 16:05 | appleseeker      
@飞天名猪
其实自动更新API调用的底层都是系统封装好的,所以,可以关注下系统本身提供的自动更新程序如何处理即可。

下载存放目录:
系统盘\Windows\SoftwareDistribution下。

IUpdateCollection中的补丁路径,是指下载路径还是安装路径?下载路径的话,都能找到。

关于IUpdateSearcher的那篇文章中参数,是我文章里表述不清,谢谢。
文中的原意是指,未安装的更新程序(即软件补丁和驱动补丁),如果指定Software的话,那驱动程序的软件补丁也同样无法更新。还有其他MS的产品更新也是。
  回复  引用  查看    
2007-08-21 17:39 | 飞天名猪      
可以加我的MSN么?bingxuefly@163.com

我的调用过程是这样的,不知道是不是哪里去得不对,补丁的下载路径获取不到。最后的strDownloadUrl总是空

WUApiLib.UpdateSearcherClass upSearch = new WUApiLib.UpdateSearcherClass();
WUApiLib.ISearchResult resSearch = upSearch.Search("Type='Software' and IsInstalled =0 ");
string strDownloadUrl;
for (int i = 0; i < resSearch.Updates.Count; i++)
{
strDownloadUrl="";
foreach (WUApiLib.IUpdateDownloadContent upDownload in resSearch.Updates[i].DownloadContents)
{
strDownloadUrl+= upDownload.DownloadUrl;
}
MessageBox.Show(strDownloadUrl);
}
  回复  引用  查看    
2007-12-11 11:51 | bodysonic3 [未注册用户]
请问使用Delphi能不能做到,还有用什么编程软件才能看到DLL函数和接口。谢谢
  回复  引用    
#17楼 [楼主]
2007-12-11 13:07 | appleseeker      
@bodysonic3
已回复邮件。
  回复  引用  查看    
2008-01-22 12:50 | 活化石 [未注册用户]
楼主是否能给一段显示DOWNLOADURL的代码(脚本或CSHARP都行).好象有人问过,但回答很让人失望:
"The WUA (and WSUS) does not support the importing of update
content that
originates from outside of the Microsoft Update Catalog."
对了,楼主对wsusscn2.cab有没有减肥的办法.
市场上的那些所谓漏洞检测,都是检测注册表,或稍加上检测文件,基本都是扯蛋,唬唬个人用户而已.
  回复  引用    
#19楼 [楼主]
2008-01-22 14:11 | appleseeker      
@活化石
DOWNLOADURL是无法取到的,这点我也很疑惑。但目前我没有取出来。以前vista的更新程序里能看到url,但现在也看不到了。

wsusscn2.cab,我没有减肥的方法。漏洞检测策略只有通过不断升级才能完善,而且wsusscn2.cab也无法通过网络来检测(除微软外)。
  回复  引用  查看    
2008-01-23 09:58 | 活化石 [未注册用户]
作这种应用就是鸡肋,如果作成自己的单击版的话:
1.WSUSSCN2.CAB的体积和检测的时间都可能成为瓶颈
2.即使是获取了DOWNLOADURL,也是完全安装.而WSUS则是应该差异安装
但调用WUA检测无疑是最权威的
3.我曾经尝试把WUSSCN2.CAB的升级作成二进制差异的方式,可惜无论是我的
代码还是现成制作PATCH的软件,对压缩后前后两个版本的文件比较的结果,得出的PATCH文件,甚至比要升级的文件本身还要大.
4.一般XP,即始是XP2,也可能要预安装WUA的客户端,我用的是3.0,更是要全面安装.这个客户端就要5M.
而一旦用WSUS的话,则什么都不用你做.即始调用WUA检测的话,只要指向WUA服务器,检测时也是非常快的.

仅作为一下研究罢了,只有特定场景下可能用得到.比如绕过盗版认证,打补丁时可能还有点效.
  回复  引用    
#21楼 [楼主]
2008-01-23 10:15 | appleseeker      
@活化石
MS在XP下的自动更新并不如意,可能你没有发现过问题,在自动更新过程中,出现问题,那下次自动更新会导致CPU的占有率为100%,间接导致系统假死状态。必须关闭该进程,或者关闭该服务。做这个应用就是能够自己去控制。

在XP下,如果你的自动更新版本不是很高的话,一旦设置网络设置代理后,是无法自动更新的。

最后一点,你用MS的自动更新更新到的远远<你自己做出来的应用的更新。

具体为什么会少,我没有做过比较,但有一点可以肯定,至少安装那些更新目前没有出现任何错误。测试机器系统XP,日文版、中文版都有。无任何说安装了某些不定而出现系统不稳定或者别的状况。

文章的主旨在于更好的扩展自己的应用。探讨该DLL的内容。
  回复  引用  查看    
2008-01-23 10:39 | 活化石 [未注册用户]
楼主说的没错,有时候一些看似无用的研究可以派生出不少东东,如这个WUA,你可涉及到BITS(后台智能文件升级),WMI等一些稀奇古怪的知识.如果总是琢磨一件事,不管结果如何,都会有收获的,更何况是技术.
  回复  引用    
2008-01-25 15:45 | 留恋星空      
mark
  回复  引用  查看    
AppleSeeker

MSN:appleseeker@hotmail.com
Mail:appleseeker@gmail.com

精品女装淘宝店


<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

与我联系

常用链接

留言簿(7)

我参与的团队

我的标签

随笔分类(63)

随笔档案(40)

Mobile Blog

最新随笔

搜索

  •  

积分与排名

  • 积分 - 88655
  • 排名 - 405

最新评论

阅读排行榜

评论排行榜

60天内阅读排行