#62690 - 2002-02-01 09:51 PM
KiXtart Systems Management Server (Part II, The Server)
|
Sealeopard
KiX Master
Registered: 2001-04-25
Posts: 11164
Loc: Boston, MA, USA
|
I hope I'm not ruining anybody's weekend with this
Jens --------------------------------------------
This is the second part in a series of Kixtart scripts. The complete series will illustrate how to create a complete Kixtart Systems Management Server (KSMS) using only Kixtart and various freeware utilities and programs which are part of the Windows operating system. KSMS enables an administrator to perform administrative tasks in off-hours and without being present at the remote computer. It can be used to install programs, remove programs, clean up the harddisks, and modify regitry entries. It does not cook coffee though. It is compatible with both Windows NT/2000 and Windows 9x.
The first part described a modular login script for Windows 9X/NT/2K. The latest version on the modular login script can be found at http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=2&t=002682.
The second part covers the server part of the KSMS. The server part consists of one Kixtart script, two initialization files, and two function libraries. The MAINTENANCE_SERVER.KIX script calls various functions in those two UDF libraries. Nevertheless, all listed UDFs are used throughout KSMS.
The file COMPUTERS.DB is an .INI file that is created by the login script. The important entry for each computername (the name in the brackets) is the MAC address. All other entries are for informational reasons only to get a quick idea what type of computer it is. They are not necessary for KSMS. Basically, each time the login script runs it writes/updates the current MAC address associated with the specific computer. More precisely, if a user elects to integrate the computer into KSMS, it'll update the information, otherwise that computer is treated as a guest computer (e.g. laptop computer of a visiting research in my case)
The file MAINTENANCE_LIST.INI is used mainly to communicate between the login script and the maintenance client script. The maintenance server script is using the MAINTENANCE_LIST.INI file to read the type of scheduling service for a specific computer and to write logging information into the file. Thus, it is possible to track down problems with the initialization of the computer maintenance on a computer.
In order for the maintenance server script to schedule maintenance it requires either the Task Scheduler or the Scheduler service. If the Scheduler service is used, then the service must be run under an administrative account since the SYSTEM account cannot establish network connections.
The maintenance server script is scheduled to run every night (2am seems to be a good time since virtually nobody is working at this time of day). It first initializes itself, loads its UDF libraries and sets the logging options. Each screen printout is also written into a log file to trace errors and monitor the script. One does not need to be logged into the computer that is running the maintenance server script as long as it is run through the Task Scheduler and is using a global administrative account. I created special KIX_SRV and KIX_CLI accounts for the server and client part of KSMS.
The server then reads a list of computers from MAINTENANCE_LIST.INI and the associated scheduler type. It checks whether it can access the admin share on each remote computer. If it cannot access it then the computer either has no admin share (therefore the client script will not be run) or the computer is not reachable. If the computer is not reachable the server script reads the MAC address and uses MAGIC.EXE to send a MagicPacket to the remote computer. This will trigger a Wake-On-LAN request for that computer if the NIC supports it. Then the script waits a little bit and checks wheter the computer is waking up by trying to access the admin share (with a 5 minute timeout). If the computer woke up successfully (admin share accessible) the script continues otherwise the script starts again with the next computer in its list.
If the remote computer is accessible through the admin share, the CLIENT_MAINTENANCE.BAT file is copied to the remote computer. This file contains a call to the CLIENT_MAINTENANCE.KIX script which does the maintenance on the remote computer. The Kixtart script sits on a server, thus is not accessible to a normal user. Also, if a user manipulates the CLIENT_MAINTENANCE.BAT then it will be overwritten with the version on the server the next time the client maintenance is initialized. This should effectively prevent tampering.
Finally, it schedules the execution of CLIENT_MAINTENANCE.BAT on the remote computer using either the Task Scheduler or the Scheduler service. The Task Scueduler is scheduled with JT.EXE from the Microsoft Windows 2000 Resource Kit Supplement 3 which is a CLI for the Task Scheduler. See also http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=1&t=003208 and http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000060
This example of KSMS has been used for two months to manage a computer network consisting of over 80 Windows 9x, NT, and 2000 computers. As part of the systems management all computers have been upgraded to Internet Explorer 5.5 Service Pack 2, an antivirus package has been distributed and various server-based applications have been installed (Microsoft Project, Microsoft Publisher, Microsoft Visio, SPSS). Additionally, system policies have been applied through the manipulation of registry entries and programs on the remote computres have been upgraded if necessare (e.g. Adobe Acrobat from 5.0.0 to 5.0.5). It is also used to essentially push specific applications to the remote computers.
The next part in this series will contain the client part of KSMS, namely CLIENT_MAINTENANCE.KIX.
You can download a ZIP-file containing the script and initialization files here: http://people.bu.edu/jenmeyer/kixtart/maintenance_server.zip
code:
<pre> ; FUNCTIONS.UDF ; ; KixTart library functions ; ; List of included functions (36 total): ; ; OSID() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000019]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000019[/URL] ; ShellCmd() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000057]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000057[/URL] ; FullFile() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000028]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000028[/URL] ; MapDrive() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000108]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000108[/URL] ; MapPrinter() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000109]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000109[/URL] ; UpdateRegistry() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000110]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000110[/URL] ; IsIncluded() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000105]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000105[/URL] ; IsInGroup() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000097]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000097[/URL] ; IsInArray() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000098]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000098[/URL] ; ATrim() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000031]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000031[/URL] ; Warning() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000099]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000099[/URL] ; DisplayText() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000036]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000036[/URL] ; Err() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000107]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000107[/URL] ; SendAlert() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000100]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000100[/URL] ; IsArray() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000088]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000088[/URL] ; Fatal() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000101]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000101[/URL] ; CheckDatabase() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000111]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000111[/URL] ; ProcessRegINI() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000112]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000112[/URL] ; RunningTime() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000038]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000038[/URL] ; SetINIValue() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000113]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000113[/URL] ; DateMath() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000102]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000102[/URL] ; SerialDate() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000089]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000089[/URL] ; CleanTempFiles() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000103]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000103[/URL] ; IsInIPRange() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000052]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000052[/URL] ; BinaryIP() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000029]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000029[/URL] ; IsInSubnet() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000053]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000053[/URL] ; IPMask() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000054]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000054[/URL] ; RunOnce() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000055]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000055[/URL] ; IsVPNConnection() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000056]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000056[/URL] ; NightlyReboot() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000106]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000106[/URL] ; RequestInstall() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000092]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000092[/URL] ; Mod() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000093]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000093[/URL] ; TimeDiff() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000040]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000040[/URL] ; SerialTime() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000039]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000039[/URL] ; Msec2Sec() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000051]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000051[/URL] ; DiskSpace() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000094]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000094[/URL] </pre>
code:
<pre> ; MAINTENANCE.UDF ; ; Kixtart functions for the maintenance script (21 total) ; ; List of included functions: ; ; CheckNICs() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000148]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000148[/URL] ; ServiceMode() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000138]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000138[/URL] ; ActiveService() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000139]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000139[/URL] ; UpdateFileOnReboot() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000142]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000142[/URL] ; RebootWarning() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000140]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000140[/URL] ; CheckLinks() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000143]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000143[/URL] ; UpdateFile() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000149]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000149[/URL] ; GetFileExt() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000144]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000144[/URL] ; CompareVersions() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000145]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000145[/URL] ; ArrayEnumKey() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000064]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000064[/URL] ; ArrayEnumValue() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000065]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000065[/URL] ; EnumIPInfoAll() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000146]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000146[/URL] ; DirList() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000090]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000090[/URL] ; GetFilePath() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000091]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000091[/URL] ; Join() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000095]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000095[/URL] ; CheckUpdateOnReboot() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000147]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000147[/URL] ; IsStringInFile() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000141]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000141[/URL] ; DisableAutoLogon() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000151]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000151[/URL] ; EnableAutoLogon() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000150]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000150[/URL] ; CheckNAVExpiration() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000159]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000159[/URL] ; BSort() [URL=http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000070]http://kixtart.org/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=12&t=000070[/URL] </pre>
code:
<pre> ; COMPUTERS.DB
[DESIGNLAB] Hostname=name1.host.com MAC Address=0123456789AB OS Kernel=WinNT Operating System=Windows NT 4.0 Workstation Service Pack 6 (Workstation) IP Address 0=0.0.0.0 Network Adapter 0=3Com EtherLink 10/100 PCI For Complete PC Management NIC (3C905C-TX)
[SCRATCH] Hostname=name1.host.com MAC Address=0123456789AB OS Kernel=WinNT Operating System=Windows NT 4.0 Workstation Service Pack 6 (Workstation) IP Address 0=0.0.0.0 Network Adapter 0=3Com Fast EtherLink XL 10/100Mb TX Ethernet NIC (3C905B-TX) </pre>
code:
<pre> ; MAINTENANCE_LIST.INI
[DESIGNLAB] Scheduler=Task Scheduler Initiated=successful at 2002/02/01 02:35:44 Initialization=successful at 2002/02/01 02:35:50 Finished=successful at 2002/02/01 02:36:39 InstallVisio=1
[SCRATCH] Scheduler=Task Scheduler Initiated=successful at 2002/02/01 02:37:51 Initialization=successful at 2002/02/01 02:37:57 Finished=successful at 2002/02/01 02:38:51 InstallMSIExec=1 </pre>
code:
<pre> ; MAINTENANCE_SERVER.KIX ; ; Maintenance server script for all computers on the NMRC-NT LAN ; ; The server script is run under the kix_server user account on the local computer ; ; Author: Jens Meyer ; Date : 10-Jan-2002 ; ; Revision : 3.0 ; Revised at : 10-Jan-2002 ; Platforms : Windows 9x, Windows NT 4.0, Windows 2000
; show the maintenance script window $retcode=SETCONSOLE('SHOW') $retcode=SETCONSOLE('FOREGROUND') $retcode=SETOPTION('HideCursor','ON') $retcode=SETOPTION('WrapAtEOL','ON') $retcode=SETTITLE('Kixtart Maintenance Server - Scheduling maintenance clients...') BREAK ON
if @INWIN=1 and @PRIV<>'ADMIN' ? 'Kixtart maintenance script requires administrative privileges' $retcode=SETOPTION('HideCursor','OFF') exit 1314 endif
gosub MAIN
$retcode=displaytext('Finished with maintenance server script') $retcode=redirectoutput('') $retcode=SETOPTION('HideCursor','OFF') exit 0
:MAIN ; read list of computers ; check if computer is online, otherwise make note/warning ; check that the scheduler is running, otherwise make scheduler running ; schedule
; initialize global variables for the script gosub INITIALIZE ; display general maintenance script information gosub GENERALINFO ; read list of computers and process tasks gosub COMPUTERS return
;------------------------------------- ; subroutine to initialize global variables ;------------------------------------- :INITIALIZE global $SCRIPTNAME, $SCRIPTVERSION, $SCRIPTDIRECTORY, $SCRIPTFUNCTIONS global $SCRIPTINI, $DBINI global $ALERTSERVER, $LOGDIRECTORY, $ERRORLOG, $LOGGINGFILE global $OUTPUTLINE, $OUTPUT, $SCROLLING, $VERBOSE, $LOGGING global $HKLM, $HKDU, $HKCR
dim $retcode, $inivalue cls
; set script information $SCRIPTNAME='maintenance_server' $SCRIPTVERSION='3.0' $SCRIPTDIRECTORY='\\SENSEI\kixtart_maintenance$' $SCRIPTFUNCTIONS=@LSERVER+'\NETLOGON\functions.udf' $MAINTENANCEFUNCTIONS=$SCRIPTDIRECTORY+'\maintenance.udf' ; define display line the the output target (screen, file) $OUTPUTLINE=0 $OUTPUT='' $SCROLLING=1 ; define registry key constants $HKLM='HKEY_LOCAL_MACHINE' $HKDU='HKEY_USERS\.Default' $HKCR='HKEY_CLASSES_ROOT'
; set global variables to default values $ALERTSERVER='REDPOINT' ; set initialization files $SCRIPTINI=$SCRIPTDIRECTORY+'\ini\maintenance_list.ini' $DBINI=$SCRIPTDIRECTORY+'\db\computers.db' ; set log files $LOGDIRECTORY='\\SENSEI\kixtart_maintenance$' $LOGGINGFILE='\\SENSEI\kixtart_maintenance$\log\maintenance_server.log' $ERRORLOG=$LOGDIRECTORY+'\log\errors.log' $VERBOSE=1 $LOGGING=1 ; initialize the Kixtart functions library if exist($SCRIPTFUNCTIONS) call $SCRIPTFUNCTIONS else ? 'Cannot find Kixtart functions library '+$SCRIPTFUNCTIONS $retcode=SETOPTION('HideCursor','OFF') exit 2 endif
; initialize the Kixtart maintenance functions library if exist($MAINTENANCEFUNCTIONS) call $MAINTENANCEFUNCTIONS else ? 'Cannot find Kixtart functions library '+$MAINTENANCEFUNCTIONS $retcode=SETOPTION('HideCursor','OFF') exit 2 endif
if $LOGGING ; initialize the log files $retcode=redirectoutput($LOGGINGFILE,1) $retcode=redirectoutput($OUTPUT) if not exist($LOGGINGFILE) ; disable logging if we cannot create the log file $LOGGING=0 endif endif
return
;------------------------------------- ; subroutine to display general maintenance script information ;------------------------------------- :GENERALINFO ; display the LAN script version $retcode=displaytext('NMRC Maintenance Script V'+$SCRIPTVERSION+' running under KixTart V'+@KIX) ; display the user information $retcode=displaytext(' User ID : '+@USERID) $retcode=displaytext(' Full Name : '+@FULLNAME) $retcode=displaytext(' Privilege : '+@PRIV) $retcode=displaytext(' Domain : '+@DOMAIN) $retcode=displaytext(' Logon Server : '+@LSERVER) ; display additional script information $retcode=displaytext('Maintenance INI : '+$SCRIPTINI) $retcode=displaytext(' Functions KIX : '+$SCRIPTFUNCTIONS) $retcode=displaytext('Maintenance KIX : '+$MAINTENANCEFUNCTIONS) return
;------------------------------------- ; subroutine to initialize global variables ; $SCRIPTINI location of maintenance initialization file ; $SCRIPTDIRECTORY location of the maintenance scripts ;------------------------------------- :COMPUTERS Dim $computernames, $computer, $remoteroot, $macaddress, $waitseconds, $counter, $maxwait
if exist($SCRIPTINI) $computernames=readprofilestring($SCRIPTINI,'','') $computernames=split($computernames,chr(10))
for each $computer in $computernames if $computer<>'' $remoteroot='\\'+$computer+'\admin$' $schedulertype=readprofilestring($SCRIPTINI,$computer,'Scheduler') if $schedulertype<>'' $retcode=displaytext(' ') $retcode=displaytext('========== BEGIN '+UCASE($computer)+' ==========') ; execute a wake-on-LAN if computer is shut down if not exist($remoteroot) $macaddress=readprofilestring($DBINI,$computer,'MAC Address') if $macaddress<>'' $retcode=displaytext('Sending a wake-on-LAN command to '+$computer) $shellcommand=fullfile($SCRIPTDIRECTORY,'tools\magic.exe')+' 128.197.181.1 24 '+$macaddress $retcode=shellcmd($shellcommand) ; wait a maximum of five minutes for computer to wake up and check every x seconds $waitseconds=10 $counter=0 $maxwait=100 do '.' $counter=$counter+$waitseconds sleep $waitseconds until $counter=$maxwait or exist($remoteroot) if $counter<$maxwait $retcode=displaytext('Computer '+$computer+' woke up after '+$counter+' seconds') else $retcode=displaytext('Computer '+$computer+' did not wake up') endif else $retcode=displaytext('Cannot find MAC address for computer '+$computer) endif else ; wait 120 seconds before starting task in order to not overload maintenance server sleep 120 endif if exist($remoteroot)
; copy the maintenance client batch file to the local computer $retcode=displaytext('Copying maintenance client batch file to '+$remoteroot) copy fullfile($SCRIPTDIRECTORY,'maintenance_client.bat') $remoteroot /h select case $schedulertype='Task Scheduler' $retcode=displaytext('Scheduling maintenance client on '+$computer) gosub TASKSCHEDULER $retcode=writeprofilestring($SCRIPTINI,$computer,'Initiated','successful at '+@DATE+' '+@TIME) case $schedulertype='Schedule' $retcode=displaytext('Scheduling maintenance client on '+$computer) GOSUB SCHEDULE $retcode=writeprofilestring($SCRIPTINI,$computer,'Initiated','successful at '+@DATE+' '+@TIME) case 1 $retcode=displaytext('Cannot schedule maintenance client on '+$computer+' due to incompatible scheduler service') $retcode=writeprofilestring($SCRIPTINI,$computer,'Initiated','failed at '+@DATE+' '+@TIME+' due to incompatible scheduler service') $retcode=warning('Computer '+$computer+' has incorrect scheduler service!') endselect else $retcode=writeprofilestring($SCRIPTINI,$computer,'Initiated','failed at '+@DATE+' '+@TIME+' due to computer being offline') $retcode=warning('Computer '+$computer+' is offline!') endif $retcode=displaytext('========== END '+UCASE($computer)+' ==========') endif endif next else $retcode=err('Cannot find maintenance initialization file '+$SCRIPTINI) endif return
;------------------------------------- ; subroutine to schedule the client maintenance script on computers running the schedule service ;------------------------------------- :SCHEDULE Dim $schedulercmd
$retcode=displaytext('Scheduling maintenance client batch file on '+$computer+' using scheduler service')
$schedulercmd = fullfile($SCRIPTDIRECTORY,'tools\soon.exe') $schedulercmd = $schedulercmd + ' \\'+$computer+' 60' $schedulercmd = $schedulercmd + ' "%COMSPEC% /e:1024 /c' $schedulercmd = $schedulercmd + ' maintenance_client.bat"' $retcode=shellcmd($schedulercmd) return
;------------------------------------- ; subroutine to schedule the client maintenance script on computers running the task scheduler service ;------------------------------------- :TASKSCHEDULER Dim $schedulercmd, $retcode $retcode=displaytext('Scheduling maintenance client batch file on '+$computer+' using task scheduler service') ; delete a potentially existing task $schedulercmd = fullfile($SCRIPTDIRECTORY,'tools\jt.exe') $schedulercmd = $schedulercmd + ' /SM \\'+$computer+' /SD maintenance_client.job' $retcode=shellcmd($schedulercmd)
; create a new task, save it, and force a run $schedulercmd = fullfile($SCRIPTDIRECTORY,'tools\jt.exe') $schedulercmd = $schedulercmd + ' /CTJ StartDate=TODAY' $schedulercmd = $schedulercmd + ' StartTime=NOW' $schedulercmd = $schedulercmd + ' HasEndDate=0' $schedulercmd = $schedulercmd + ' KillAtDuration=0' $schedulercmd = $schedulercmd + ' Disabled=0' $schedulercmd = $schedulercmd + ' Type=ONCE' $schedulercmd = $schedulercmd + ' /SC NMRC-NT\kix_cli kixtartclient' $schedulercmd = $schedulercmd + ' /SJ ApplicationName="maintenance_client.bat"' $schedulercmd = $schedulercmd + ' Parameters=""' $schedulercmd = $schedulercmd + ' WorkingDirectory="%SYSTEMROOT%"' $schedulercmd = $schedulercmd + ' Comment="Kixtart Maintenance Client Script"' $schedulercmd = $schedulercmd + ' Creator="Kixtart Maintenance Server"' $schedulercmd = $schedulercmd + ' Priority=Normal' $schedulercmd = $schedulercmd + ' MaxRunTime=3600000' $schedulercmd = $schedulercmd + ' DontStartIfOnBatteries=0' $schedulercmd = $schedulercmd + ' KillIfGoingOnBatteries=0' $schedulercmd = $schedulercmd + ' RunOnlyIfLoggedOn=0' $schedulercmd = $schedulercmd + ' SystemRequired=0' $schedulercmd = $schedulercmd + ' DeleteWhenDone=1' $schedulercmd = $schedulercmd + ' Suspend=0' $schedulercmd = $schedulercmd + ' StartOnlyIfIdle=0' $schedulercmd = $schedulercmd + ' KillOnIdleEnd=0' $schedulercmd = $schedulercmd + ' RestartOnIdleResume=0' $schedulercmd = $schedulercmd + ' Hidden=0' $schedulercmd = $schedulercmd + ' TaskFlags=0' $schedulercmd = $schedulercmd + ' /SM \\'+$computer $schedulercmd = $schedulercmd + ' /SAJ maintenance_client.job' $schedulercmd = $schedulercmd + ' /SAC maintenance_client.job' $schedulercmd = $schedulercmd + ' /RJ'
$retcode=shellcmd($schedulercmd)
return </pre>
[ 29 July 2002, 18:39: Message edited by: sealeopard ]
_________________________
There are two types of vessels, submarines and targets.
|
Top
|
|
|
|
#62691 - 2002-02-01 11:23 PM
Re: KiXtart Systems Management Server (Part II, The Server)
|
Alex.H
Seasoned Scripter
Registered: 2001-04-10
Posts: 406
Loc: France
|
|
Top
|
|
|
|
Moderator: Glenn Barnas, NTDOC, Arend_, Jochen, Radimus, Allen, ShaneEP, Ruud van Velsen, Mart
|
1 registered
(mole)
and 598 anonymous users online.
|
|
|