前几天写过关于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)
相关文章
- java EE技术体系——CLF平台API开发注意事项(1)——后端开发
- ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料
- c#让窗体永在最前 调用windows api 将窗体设为topmost
- 【MySQL】-NO.21.MySQL.1.MySQL.1.001-【Install MySQL5.7 On Windows】
- Delphi使用Windows API函数AnimateWindow实现窗体特效
- windows下配置lamp环境(1)---安装Apache服务器2.2.25
- ArcGIS API for Silverlight应用开发系列(1)自定义专题图
- google maps js v3 api教程(1) -- 创建一个地图
- 如何为打开的Windows应用程序分配alt + f1键
- 简单API练手:(1)复制自身程序到windows目录和系统目录下;(2)获得系统的相关信息。