Recipe 10.13. Checking and Modifying the Set of Tasks Windows Automatically Runs at LoginCredit: Daniel Kinnaer ProblemYou need to check which tasks Windows is set to automatically run at login and possibly change this set of tasks. SolutionWhen 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) DiscussionThe 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 wr 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) The TRy/finally constructs used 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 AlsoDocumentation 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. |