I l@ve RuBoard Previous Section Next Section

7.9 Checking and Modifying the Set of Tasks Windows Automatically Runs at Logon

Credit: Daniel Kinnaer

7.9.1 Problem

You need to check which tasks Windows is set to automatically run at logon and possibly change these tasks.

7.9.2 Solution

When administering Windows machines, it's crucial to keep track of the tasks each machine runs at logon. Like so many Windows tasks, this requires working with the registry, and standard Python module _winreg enables this:

from _winreg import *

aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)

try:
    targ = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
    print "*** Reading from", targ, "***"
    aKey = OpenKey(aReg, targ)
    try:
        for i in range(1024):
            try:
                n, v, t = EnumValue(aKey, i)
                print i, n, v, t
            except EnvironmentError:
                print "You have", i, "tasks starting at logon"
                break
    finally:
        CloseKey(aKey)

    print "*** Writing to", targ, "***"
    aKey = OpenKey(aReg, targ, 0, KEY_WRITE)
    try:
        try:
            SetValueEx(aKey, "MyNewKey", 0, REG_SZ, r"c:\winnt\explorer.exe")
        except EnvironmentError:
            print "Encountered problems writing into the Registry..."
            raise
    finally:
        CloseKey(aKey)
finally:
    CloseKey(aReg)

7.9.3 Discussion

The Windows registry holds a wealth of crucial system-administration data, and the Python standard module _winreg makes it feasible to read and alter data held in the registry. One of the items held in the Windows registry is a list of tasks to be run at logon. This recipe shows how to examine this list and how to add a task to the list so it is run at logon.

If you want to remove the specific key added by this recipe, you can use the following simple script:

from _winreg import *
aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
targ = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
aKey = OpenKey(aReg, targ, 0, KEY_WRITE)
DeleteValue(aKey, "MyNewKey")
CloseKey(aKey)
CloseKey(aReg)

The try/finally constructs used in the recipe are far more robust than this simple sequence of function calls, since they ensure everything is closed correctly regardless of whether the intervening calls succeed or fail. This is strongly advisable for scripts that will be run in production, particularly for system-administration scripts that will generally run with administrator privileges and therefore might potentially harm a system's setup if they don't clean up after themselves properly. However, you can omit the try/finally when you know the calls will succeed or don't care what happens if they fail. In this case, if you have successfully added a task with the recipe's script, the calls in this simple cleanup script should work.

7.9.4 See Also

Documentation for the standard module _winreg in the Library Reference; Windows API documentation available from Microsoft (http://msdn.microsoft.com); information on what is where in the registry tends to be spread among many sources, but for some collections of such information, see http://www.winguides.com/registry and http://www.activewin.com/tips/reg/index.shtml.

    I l@ve RuBoard Previous Section Next Section