I have a Python script that I have been using for over a year that updates the XDB file. It does a lot of error checking, too.

I have used it for SAV CE 8.x, 9.x and 10.x without any problems.
You would have to install Python from www.python.org, so this may not be practical for everyone. I run this from a scheduled task every afternoon around 5:00 Eastern.
You should verify AVPATH and TMPPATH variables.
-John
CODE
"""
Symantec Antivirus 8.x, 9.x, 10.x Coporate Edition XDB Definition Updater
Mar-17-2005
-John Taylor
Automatically updates XDB virus definitions from Symantec's web site.
Also, restarts services so that the new definition file will take effect.
"""
import sys,re,urllib,urllib2,md5,os.path,os,shutil,time,glob
WEBPAGE="http://securityresponse.symantec.com/avcenter/download/pages/US-SAVCE.html"
TMPPATH=r'C:\Windows\Temp'
AVPATH=r'C:\Program Files\SAV'
URLRE = re.compile("""href="(http://definitions.symantec.com/defs/xdb/.*?)">""",re.IGNORECASE)
MD5RE = re.compile("""href="/avcenter/refa.html#md5">MD5</a>:(.*?)<a""",re.IGNORECASE|re.MULTILINE)
#############################################################################################
def main():
print
print "Retrieving:"
print WEBPAGE
local_only = 0 # Just for script development & debugging
def_file = None
if 1 != local_only:
try:
url = urllib2.urlopen( WEBPAGE )
page = url.read()
except urllib2.HTTPError, e:
print
print e
print
sys.exit()
except:
print
print "Error retrieving url:", WEBPAGE
print
sys.exit()
data = page.split()
for line in data:
match = URLRE.match(line)
if None != match:
def_file_url = match.group(1)
break
print
print "def_file_url:", def_file_url
slots = def_file_url.split( "/" )
def_file = slots[-1:][0]
def_file = TMPPATH + "\\" + def_file
print "def_file:", def_file
match = MD5RE.search(page)
md5sum = match.groups(1)[0].strip()
print "md5sum:", md5sum
print
if os.path.isfile( def_file ):
print "File already exists:", def_file
print "Deleting."
os.unlink( def_file )
print "Downloading:", def_file_url
urllib.urlretrieve( def_file_url, def_file )
else:
# Just for debugging
def_file = "vd1cd412.xdb"
md5sum="52D5B99589D4D2C01E4E29A2ED2EC3B4"
print "Checking md5:",
fp = open(def_file,"rb")
def_file_data = fp.read()
fp.close()
m = md5.new()
m.update( def_file_data )
digest = m.hexdigest().upper()
print digest
if digest == md5sum:
print "MD5 Hashes match."
else:
print "MD5 Hashes DO NOT MATCH."
print "\t expected: ", md5sum
print "\t received: ", digest
sys.exit()
# stop services
srv="DefWatch"
print "Stopping", srv, "service: ",
cmd = r'C:\WINDOWS\system32\net.exe'
cmd = '%s stop "%s"' % (cmd,srv)
rc = os.system( cmd )
time.sleep(10)
print rc
srv="Symantec Antivirus"
print "Stopping", srv, "service: ",
cmd = r'C:\WINDOWS\system32\net.exe'
cmd = '%s stop "%s"' % (cmd,srv)
rc = os.system( cmd )
time.sleep(20)
print rc
# remove any older .xdb files
old_xdb_list = AVPATH + r'\*.xdb'
rm_list = glob.glob( old_xdb_list )
if len(rm_list) > 0:
for fname in rm_list:
try:
print "Removing old .xdb file:", fname
os.remove( fname )
except IOError, e:
print "IO Error:", e
print "While attempting to remove %s" % ( fname )
print
# move def file to it's final destination
try:
shutil.move(def_file, AVPATH)
time.sleep(2)
except IOError, e:
print "IO Error:", e
print "While attempting to move %s to %s" % (def_file,AVPATH)
print
except:
print "Unknown error while attempting to move %s to %s" % (def_file,AVPATH)
print
# restart services
print
srv="DefWatch"
print "Starting", srv, "service: ",
cmd = r'C:\WINDOWS\system32\net.exe'
cmd = '%s start "%s"' % (cmd,srv)
rc = os.system( cmd )
time.sleep(10)
print rc
srv="Symantec Antivirus"
print "Starting", srv, "service: ",
cmd = r'C:\WINDOWS\system32\net.exe'
cmd = '%s start "%s"' % (cmd,srv)
rc = os.system( cmd )
time.sleep(2)
print rc
print
print "Program finished!"
print
#############################################################################################
main()
# End of Script