Installation instructions - mixed environments

These instructions are based off Using srvany to create a system service but a bit more in-depth.

This is used in a mixed Windows2000/XP environment with both desktops and laptops (with wifi). Since the laptops don't usually have a wifi connection when they first start up, I had to write a script that would delay running wpkg until a connection was available.


Basic operation

Though it's a bit messy, all my wpkg files (listed above) are in \\server\software, as well as all my installation packages (they are actually in subdirectories below that). Again, I've had wpkg installed for a long time, thats the way it was originally setup.

Install wpkg by running \\server\software\install-wpkg.js. This copies over srvany.exe, instserv.exe and invoke-wpkg.js to the System32 directory. It then installs Windows Script Host (scripten.exe), and installs a service for "Windows Packager". (I use Srvany to invoke wpkg just because I've always done it that way, it would be possible to use these instructions to do it another way. Not that it makes a big difference, but my server is a Debian box running Samba.)

The "Windows Packager" service runs the invoke-wpkg.js in the local System32 directory, which keeps trying to ping the server until it either connects (in which case it starts wpkg.js), or runs into the maxRetries value (in which case it silently gives up). This means someone can log into a laptop while out of the office, and when they come in (assuming invoke-wpkg hasn't given up yet), it will run the wpkg installer.

One of my services also runs update-wpkg.bat every time wpkg runs (see below), which means if I've made any changes to the invoke-wpkg.js script, they get copied over.

I'm also using the Web interface to configure wpkg, but that's not a requirement for this setup.

Files

I have the following scripts installed in a network share:

 wpkg.js - The main wpkg script
 invoke-wpkg.js - The script that invokes wpkg, which lives on the client system
 install-wpkg.bat - The wpkg installer
 install-registry.js - A script invoked by the installer
 update-wpkg.bat - A script run by wpkg every time that updates invoke-wpkg.js
 srvany.exe - The Microsoft file to allow any program to run as a system service
 instsrv.exe - The Microsoft file to install a system service
 instserv.exe - The Microsoft program to get service stati (note, this has an E that instsrv does not have. it was also released one tools kit earlier)
 scripten.exe - The updated Windows script host


We are using the srvany.exe and instsrv.exe programs included with the Windows 2000 Resource Kit to install the wpkg.js script with the /synchronize /quiet options as a system service.

srvany.exe and instsrv.exe programs cannot be distributed along with this software for licensing reasons. However, you can find links in the download section.


install-wpkg.bat

You need to modify the \\server\software path to fit your environment.

 @echo off
 copy \\server\software\srvany.exe %SystemRoot%\System32
 copy \\server\software\instsrv.exe %SystemRoot%\System32
 copy \\server\software\invoke-wpkg.js %SystemRoot%\System32
 instsrv "Windows Packager" "%SystemRoot%\System32\srvany.exe"
 \\server\software\scripten.exe /Q /R:N
 wscript.exe \\server\software\install-registry.js
 net start "Windows Packager"


 var WshShell = WScript.CreateObject("WScript.Shell");
 var srvKey = "HKLM\\SYSTEM\\CurrentControlSet\\Services\\Windows Packager\\Parameters\\";
 var appKey = srvKey + "Application";
 var parKey = srvKey + "AppParameters";
 var srvPath = WshShell.ExpandEnvironmentStrings("%SystemRoot%") + "\\System32\\wscript.exe";
 var srvArgs = WshShell.ExpandEnvironmentStrings("%SystemRoot%") + "\\System32\\invoke-wpkg.js";
 WshShell.RegWrite(appKey, srvPath, "REG_SZ");
 WshShell.RegWrite(parKey, srvArgs, "REG_SZ");

update-wpkg.bat

You need to modify the \\server\software path


 @echo off
 copy \\server\software\invoke-wpkg.js %SystemRoot%\System32

invoke-wpkg.js

You need to update all the variables at the top. The wpkgRoot and software variables set the WPKGROOT and SOFTWARE environment variables like the wpkg-start.bat.examples file distributed with wpkg.

 /*******
  * Invoke wpkg.js script
  * Waits for a connection to the server, then starts wpkg.
  * Good for laptops, or any other system with unstable connectivity.
  * (c)2006 Greg MacLellan
  */
 
 // the hostname or IP to ping
 var host = "server";
 // the location of wpkg.js. This will become the %WPKGROOT% environment variable
 // Remember to escape backslashes! (eg, \\server\share becomes "\\\\server\\share")
 var wpkgRoot = "\\\\" + host + "\\software";
 // The software root, this will just become the %SOFTWARE% environment variable
 var software = wpkgRoot;
 // Parameters to pass to wpkg
 var wpkgParams = "/synchronize /quiet ";
 // The wait time between ping tries
 var waitTime = 10000;
 // The maximum number of times to try before giving up
 // 0 to never give up.
 var maxTries = 999;
 
 
 
 /*****************
  Do not edit below this line
  *****************/
 
 var wpkgBin = wpkgRoot + "\\wpkg.js";
 
 // setup wsh objects
 var shell = WScript.CreateObject("WScript.Shell");
 var env = shell.Environment("PROCESS");
 
 // setup env variables
 env("WPKGROOT") = wpkgRoot;
 env("SOFTWARE") = software;
 
 var numTries = 0;
 while ((maxTries <= 0) || (numTries < maxTries)) {
 
         if (maxTries > 0) numTries++; // only increment if there's a limit
 
         var code = shell.Run("ping " + host + " -n 1", 0, true);
         if (code == 0) {
                 // connected
                 WScript.Sleep(2000);
                 // wait 2 seconds, and start wpkg.js
                 shell.Run(wpkgBin + " " + wpkgParams);
                 break;
        } else {
                 WScript.Sleep(waitTime);
        }
}

Update wpkg packages.xml entry

 <package id='update_wpkg' name='Update wpkg invocation script' revision='1' priority='20' reboot='false' >
    <install cmd='%SOFTWARE%\update-wpkg.bat' />
 </package>

Misc

Please update this page with any additional information or fixes.