Recipe 10.13. Checking and Modifying the Set of Tasks Windows Automatically Runs at Login
Credit: Daniel Kinnaer
Problem
You need to check which tasks Windows is
set to automatically run at login and possibly change this set of
tasks.
Solution
When administering Windows machines, it's crucial to
keep track of the tasks each machine runs at login. Like so many
Windows tasks, this requires working with the registry, and standard
Python module _winreg enables this:
import _winreg as wr
aReg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
try:
targ = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
print "*** Reading from", targ, "***"
aKey = wr.OpenKey(aReg, targ)
try:
for i in xrange(1024):
try:
n, v, t = wr.EnumValue(aKey, i)
print i, n, v, t
except EnvironmentError:
print "You have", i, "tasks starting at logon"
break
finally:
wr.CloseKey(aKey)
print "*** Writing to", targ, "***"
aKey = wr.OpenKey(aReg, targ, 0, wr.KEY_WRITE)
try:
try:
wr.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)
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 login (in addition to other lists
held elsewhere, such as the user-specific
Startup folder that this recipe does not deal
with).This recipe shows how to examine the registry list of login tasks,
and how to add a task to the list so it is run at login. (This recipe
assumes you have Explorer installed at the specific location
c:\winnt. If you have it installed elsewhere,
edit the recipe accordingly.)If you want to remove the specific key added by this recipe, you can
use the following simple script:
import _winreg as wrThe TRy/finally constructs used
aReg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
targ = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
aKey = wr.OpenKey(aReg, targ, 0, wr.KEY_WRITE)
wr.DeleteValue(aKey, "MyNewKey")
wr.CloseKey(aKey)
wr.CloseKey(aReg)
in the recipe are far more robust than the simple sequence of
function calls used in this latest snippet, since they ensure that
everything is closed correctly regardless of whether the intervening
calls succeed or fail. This care and prudence are strongly advisable
for scripts that are meant be run in production, particularly for
system-administration scripts that must generally run with
administrator privileges. Such scripts therefore might 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 just fine.
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 information among
many sources, but for some useful collections of such information,
see http://www.winguides.com/registry and
http://www.activewin.com/tips/reg/index.shtml.