微软的自动更新企业服务端从SUS升级到了WSUS之后,原来的补丁KB文件名改成了按文件水印值,又根据水印值末尾做了目录分离,减少了目录里的文件数目。这给按文件名下载造成了一些不便,比如360安全工具的补丁管理功能就只能支持SUS的文件名方式(截至360安全卫士程序版本:5.0.0.1032)。
WSUS的补丁文件名字与文件水印值的关系储存在数据库中,同时本地的补丁文件状况也存在数据库中。Wsus.info网站上很多小工具可以根据文件名提取补丁,如(http://www.wsus.info/forums/lofiversion/index.php?t10723.html),但仍然不大方便。下面就给出利用定制IIS的404错误页面,实现按文件名下载功能的程序。
/redir404.asp 文件,主程序
<%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit %>
<%
' Copy from adovbs.inc
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Const adCmdText = &H0001
Const ContentDIR = "content"
Function HexWithZero(IntNum)
If IntNum < 16 Then
HexWithZero = "0" & Hex(IntNum)
Else
HexWithZero = Hex(IntNum)
End If
End Function
Function BinToHex(BinStr)
Dim i, HexStr
For i = 1 to LenB(BinStr)
HexStr = HexStr & HexWithZero(AscB(MidB(BinStr, i, 1)))
Next
BinToHex = HexStr
End Function
Sub SubNotFound
Response.Status = "404 Not Found"
Response.Write(response.Status)
Response.End
End Sub
'###Main###
dim QUERY_STRING, FileName, IndexOf
QUERY_STRING = Request.ServerVariables("QUERY_STRING")
IndexOf = InStrRev(QUERY_STRING, "/")
if IndexOf>0 Then FileName = Right(QUERY_STRING, len(QUERY_STRING) - IndexOf)
If len(FileName)=0 then
SubNotFound
End If
FileName = Replace(FileName,"'", "''")
%>
<!--#include file="SQL_connection.asp"-->
<%
Dim SqlConn, rs, sql
set SqlConn = Server.CreateObject("ADODB.Connection")
Sqlconn.open strDSN
set rs=Server.CreateObject("ADODB.RecordSet")
sql= "select tbFile.*, tbFileOnServer.ActualState ActualState from tbFile " &_
" inner join tbFileOnServer on tbFile.FileDigest = tbFileOnServer.FileDigest " &_
" where (tbFile.FileName='" & FileName & "') ;"
rs.open sql,SqlConn,adOpenForwardOnly,adLockReadOnly,adcmdtext
if rs.state=0 or rs.eof then
SqlConn.close
SubNotFound
else
Dim FileDigest, ActualState, MUURL, RedirectURL, FileExt
FileDigest = BinToHex(rs("FileDigest"))
ActualState = rs("ActualState")
MUURL = rs("MUURL")
rs.close
SqlConn.close
set rs=nothing
set sqlconn=nothing
if ActualState <> 12 Then
Response.Redirect MUURL
Response.End
Else
If len(FileDigest) = 40 Then
FileExt = right(FileName, Len(FileName) - InStrRev(FileName , "."))
RedirectURL = "/"& ContentDIR &"/"& Right(FileDigest,2) &"/"& FileDigest & "." & FileExt
Response.AddHeader "Content-Disposition", "attachment; filename="& FileName
Response.Redirect RedirectURL
response.end
Else
SubNotFound
End If
End If
end if
%>
SQL_connection.asp配置文件,指出了数据库连接字符串。这个文件需要按实际情况修改。'该数据库连接只需要对SUSDB数据库的tbFile和tbFileOnServer.表有读取权限即可,出于安全性考虑,应拒绝所有写入的权限。
<%
Dim strSQLServerName, strSQLDBUserName, strSQLDBPassword, strSQLDBName
Dim strDSN
strSQLServerName = "127.0.0.1,1433"
strSQLDBUserName = "请修改数据库用户名"
strSQLDBPassword = "请修改数据库密码"
strSQLDBName = "SUSDB"
strDSN="Provider=SQLOLEDB;driver={SQL Server};server="&strSQLServerName&"; uid="&strSQLDBUserName&";pwd="&strSQLDBPassword&";database="&strSQLDBName&""
%>
定制404错误的步骤是:将以上两个文件放入WSUS的网站根目录下的新建目录(如/redir404),并在IIS管理界面点中选中需要重定向的目录(考虑与SUS兼容,一般为/content),点菜单【操作】,选择【属性】,选择其中的【自定义错误】,下拉列表找到HTTP错误为【404】的条目,点【编辑】按钮,把【消息类型】改为【URL】,把【URL】一栏填入第一个文件的路径,如【/redir404/redir404.asp】,点两次确定保存操作。
为了提高检索效率,管理员可以给SUSDB数据库tbFile文件按照FileName列建立索引。
至此用户即可自动通过指定的站点目录和补丁名下载到WSUS里以水印名形式保存的文件。如果文件在数据库中存在,但由于种种原因没有保存到本地,服务器将会把用户重定向到微软的下载地址;如果文件名在数据库中不存在,将返回文件不存在的错误给用户。
来源:《中国教育网络》2009年5月刊
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。