NET框架提供了一些新的工具简化NET胖客户端程序的部署本文阐述了NET自动部署技术的基础知识以及防止用户错误下载黑客程序和病毒代码的安全机制
NET的自动部署技术构造在NET框架之中它使得应用程序能够通过HTTP连接从远程服务器按需下载程序集有了这个功能我们可以把胖客户端应用程序发布到一个Web服务器确保用户下一次使用应用程序时总是自动得到程序的最新版本设想一下吧再也不必用CD来发布升级软件再也不必在电话中向用户反复解释因版本沖突引起的问题!
NET提供了大量用于实现自动部署机制的功能例如NET知道如何从一个远程服务器下载程序集并把它保存到用户的磁盘缓沖区而且只有当远程服务器上又有了新的版本时才再次下载——所有这些功能都已经构建到了NET框架之中
一自动部署执行文件
自动部署NET Windows窗体应用程序的机制可分为两部分第一部分是自动部署主执行文件第二部分是允许用户使用应用程序时下载应用的其余部分
首先我们来看看第一部分让用户访问主执行文件很简单只要把执行文件发布到Web服务器然后把URL告诉用户例如假设执行文件的名字为loaderexe我们可以在企业的Web服务器上创建一个虚拟目录然后把执行文件的位置告诉每一个用户
用户只要用浏览器打开这个URL或者在开始菜单运行输入框输入这个URL就可以运行loaderexe执行文件另外我们还可以创建一个Web页面加入一个指向loaderexe的HTML HREF标记
图从Web服务器发布执行文件 下面我们运行一下本文下载包中的一个NET执行文件
⑴ 从本文最后下载文件将文件解压缩到C:\CodeDownloadDemo文件夹
⑵ 在IIS中创建一个虚拟文件夹CodeDownloadDemo
⑶ 将虚拟文件夹映射到C:\CodeDownloadDemo\Loader\Bin文件夹
⑷ 启动IE浏览器输入下面的URL
看到loader应用程序在浏览器外面运行了吗?应用程序一旦开始运行即使关闭了浏览器我们仍可以访问应用程序对于任何其他NET应用程序我们都可以照此办理只要将它放到Web服务器上然后用浏览器启动即可
二UrlScan工具的影响
只要Web服务器上没有安装UrlScan工具上面的例子就可以毫无问题地运行UrlScan工具随同IIS Lockdown工具一起发行它的功能是禁止向Web服务器发送非法的请求默认情况下UrlScan工具认为包含执行文件的URL都是非法的因此如果Web服务器上安装了UrlScan对的访问将被禁止
要检查系统中是否已经安装了UrlScan工具可以在控制面板中打开添加或删除程序查看当前安装的程序清单
另外我们还可以修改UrlScan的默认配置使其允许对执行文件的请求即修改一下UrlScan用来检测合法/非法请求的INI配置文件UrlScan的配置文件保存在c:\windows\system\inetsvr\urlscan\urlscanini下面是该文件的一个片断
[DenyExtensions]
; Deny executables that could
; run on the server
was_exe
bat
cmd
这个配置文件片断中exe文件扩展名已经改成了was_exe表示exe扩展名不再被禁止但必须注意的是这是解除UrlScan限制的一种简便方法可能带来安全风险对于正式为用户提供服务的Web服务器修改配置之前务必阅读UrlScan的文档或询问网络管理员
修改UrlScan的INI配置文件之后必须重新启动IIS服务器才能让修改生效例如在命令行环境中执行IISRESETexe就可以重新启动IIS服务器
三自动部署应用程序的其余部分
前面我们了解了如何自动部署一个执行文件这种办法对于loader(约 KB)之类的小型应用程序有效但通常的应用程序都要大于 KB例如如果应用程序有 MB我们不应该让用户每次运行时都重新下载一个 MB的文件解决这个问题需要用到NET自动部署机制的第二部分技术
和前面的办法相比一种更好的办法是将主执行程序安装到用户的硬盘上让这个主执行程序按需下载应用程序的其余部分例如当用户要用到应用程序的Invoicing模块时就下载Invoicing部分要用到Employees模块时就下载Employees部分(参见图)
图自动部署一个应用程序这种类型的部署通常称为滴流部署(Tickle Down Deployment)NET框架提供了支持滴流布署技术的必要工具类即SystemReflection名称空间中的AssemblyAssembly类能够从远程服务器下载一个程序集并在本地缓沖以供以后引用例如利用下面的代码可以//localhost/CodeDownloadDemo/Loader/下载ModuleAdll程序集然后从该程序集创建EmployeeForm类的实例
指定URL
Dim URL As String
URL = _
从指定的URL装入程序集
Dim a As [Assembly]
a = [Assembly]LoadFrom(URL)
获得一个EmployeeForm类的引用
Dim t As Type = aGetType(ModuleAEmployeeForm)
创建窗体的实例并显示出窗体
Dim o As Object = ActivatorCreateInstance(t)
oShow()
这个代码片断虽然简单却用到了NET框架许多值得关注的特性下面我们就来逐一分析这些特性
首先[Assembly]LoadFrom这行代码利用HTTP协议下载一个DLL在本例中URL指向localhost但它同样也可以指向一个远程服务器例如这就是说我们只要一行代码并指定一个适当的URL其余工作就全交给NET了不管程序集是本地的还是远程的
其次从远程服务器下载得到一个DLL之后aGetType这行代码从该DLL提取一个类的引用注意类的名称以字符串的形式指定这意味着我们可以在运行时临时决定要引用的类的名称这一点非常重要因为现在我们可以在运行时决定要引用的是ModuleAEmployeeForm还是ModuleAInvoiceForm对于VBNET和C#之类强类型的语言这一特性显得尤其宝贵它提供的灵活性是这类语言中非常罕见的
最后ActivatorCreateInstance(t)这行代码实际创建了EmployeeForm类的一个实例有了类的实例之后接下来就可以调用它的方法设置它的属性在上面的例子中我们调用了EmployeeForm类的Show方法
四localhost与的区别
当我们指定的URL是//localhost形式时前面两节介绍的办法都不会出现问题但是如果我们改用形式的URL就会遇到问题例如如果用这个URL来打开loaderexe就会看到类似图的错误信息
图用访问时出现的错误系统的配置不同具体的错误信息也不同但不管错误信息到底是什么用总是可以看到与安全有关的错误信息
当我们通过一个URL来运行应用程序时应用程序可能来自一个远程服务器但是NET不能肯定我们想要运行的代码是来自一个可信任的服务器还是一个受限制的站点NET对远程代码采用的安全策略相当复杂简单地说NET把那些不包含句点符号()的URL视为本地Intranet的URL默认情况下NET允许运行来自Intranet站点的代码另一方面NET把那些包含了句点符号的URL(例如)视为Internet地址除非明确地设定某个URL是一个安全的位置否则NET默认不允许运行Internet URL的程序代码
安全策略是NET框架必不可少的组成部分如果没有安全策略允许用户将浏览器指向任何URL下载NET执行文件并自动运行那只会把网络变成病毒编写者的天堂有了NET安全策略我们就可以保护用户避免用户下载和运行来源不明的代码
也许大家已经知道NET框架是一个与操作系统紧密集成的系统安全机制是这种紧密集成特别明显的领域之一NET安全策略不仅强大而且具有高度可配置的特点下面我们就来了解一下这些安全策略的基本组织以及如何配置安全策略允许用户从可信任的URL下载执行文件