最开始有这个想法是因为有一段时间IE常出问题,而需在运行框里输入的重装命令恐怕比女性的丝袜短不到哪里去···。但是每次重启之后,下拉列表里的命令总是不翼而飞。
我们非常清楚地知道,最近使用的命令(如果您统计过的话,是最近使用过的 26 个)缓存在计算机上的某个地方。更确切地说,它作为单个注册表值存储在注册表项 HKCU/Software/Microsoft/Windows/CurrentVersion/Explorer/RunMRU 中。事实证明,在“运行”对话框中键入的每个命令在注册表中都有其对应值;通过使用字母 A 到 Z 为这些值分配了名称(这也就解释了为何在注册表中只有 26 个最近使用的命令被跟踪的原因)。在注册表中,RunMRU 如下图所示:
事实上在这里脚本专家已经告诉我们如何编写脚本来读取这一系列值。我所需要做的只是简单的将每次读取的一系列值写入一个文本文件。我这里做的非常简单,实际上你自己还可以做的更复杂些,以便达到你的目的,比如监视某个用户在哪个时间使用了哪些命令。
On Error Resume Next
Const HKEY_CURRENT_USER = &H80000001
Const ForReading = 1
Const ForWriting = 2
Const FileHeader = "RunCmdList:"
strComputer = "."
Set objRegistry = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv")
strKeyPath = "Software/Microsoft/Windows/CurrentVersion/Explorer/RunMRU"
objRegistry.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValueNames, arrValueTypes
Set objFSO = CreateObject("Scripting.FileSystemObject")
If NOT objFSO.FileExists("c:/RunCmdList.txt") then
Set objFile = objFSO.OpenTextFile("c:/RunCmdList.txt", ForWriting, True)
objFile.Write FileHeader
objFile.Close
End If
Set objFile = objFSO.OpenTextFile("c:/RunCmdList.txt", ForReading)
strFile = objFile.ReadAll
objFile.Close
arrLines = Split(strFile, vbCrLf)
For Each strValue in arrValueNames
If Len(strValue) = 1 Then
IsE = True
objRegistry.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValue,strRunCommand
intLength = Len(strRunCommand)
strRunCommand = Left(strRunCommand, intLength - 2)
For Each strLine in arrLines
If strRunCommand = strLine Then
IsE = False
End If
Next
If Ise Then
strFile = strFile & vbCrLf & strRunCommand
End If
End If
Next
Set objFile = objFSO.OpenTextFile("c:/RunCmdList.txt", ForWriting)
objFile.Write strFile
objFile.Close
上面的脚本只是将读取得值存入C:/RunCmdList.txt中,并且里面不会出现重复的行。对于一些很复杂的命令(你很容易忘记用途的),你可以在该命令上或下另起一行注释,不会影响运行。
其实我刚开始还想将其加入注销和关机脚本,以便我们每次关机或注销时它自动记录,而无需我们手动运行一次。而实际上结果并不如意,更甚的是,脚本什么都没读到,我猜想可能是因为在脚本运行前,系统已经将注册表相关值删除了。除了这个方法,我们还可以添加几行代码使脚本每隔一段时间运行一次,不过为此消耗系统资源是否值得,就看个人需要了