我可以列出没有注册表项的应用程序吗?

时间:2014-04-02 14:16:21

标签: windows vbscript registry portability

我一直致力于快速轻松地列出我机器上安装的所有软件。完成后,我想将其发送给我的小组,以便我可以让每个人都运行它。由于本练习的目的是生成我们绝对需要访问IT管理员的所有应用程序的列表,因此我不想错过任何重要的内容。

到目前为止,我已经使用了与this非常相似的代码 - 它在软件\ Microsoft \ Windows \ CurrentVersion \ Uninstall \和Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion的注册表中查找\卸载\并给我所有已安装的软件。然而,一些重要的程序显然不存在(例如R,RStudio,SQL Developer),我认为它是因为它们不使用Windows安装程序。

这让我想到了一个问题 - 有没有办法列出可以在我的机器上运行的所有程序(没有影响注册表)?从本质上讲,我认为我想要所有非系统* .exe文件,但这可能过于简单了。

有人有什么想法吗?我的代码现在是VBS,但我可以在大多数事情上混淆。

2 个答案:

答案 0 :(得分:1)

如果要全部找到它们,则需要搜索计算机上的每个文件,并检查它是否具有可执行扩展名。我有理由相信你不想这样做。

答案 1 :(得分:0)

我读了你的答案并笑了起来,因为我也“有理由相信”我不想浏览我(或其他任何人)机器上的所有文件。一旦笑声停止,我意识到这基本上就是我必须做的......

我想出了一些有用的东西,它现在需要几分钟才能运行(只需要几秒钟来检查注册表),但它确实有效。我把它放在这里,以防它可以帮助别人,或者也许有人可以找到一种方法来提高效率。您需要提供一些路径到您要查找exe文件的文件夹,以及要输出到的文件。

感谢阅读。

On Error Resume Next
Folders = Array("C:\users\me","C:\SoftwareFolder1","C:\SoftwareFolder2","C:\SoftwareFolder3")
sFile="C:\myExeFiles.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1
Const ForWriting = 2
Const OverwriteIfExist = -1

Set fFile = objFSO.CreateTextFile(sFile, OverwriteIfExist, OpenAsASCII) 

For Each x In Folders
    Set objFolder = objFSO.GetFolder(x)
        suckTheData objFSO, fFile, objFolder
    Set objFolder = Nothing
Next
MsgBox("Done")
Set objFSO = Nothing

Sub suckTheData(objFSO, fFile, objFolder)
    ' *** STEP 1 *** 'Find files with a partiular extension in this folder 
    For Each objFile In objFolder.Files
        If UCase(objFSO.GetExtensionName(objFile.Name))="EXE" Then
            fFile.Write objFile & vbCrLf
            If Err.Number <> 0 Then 
                fFile.Write "Error: " & objFile & " " & Err.Number & Err.Source & " " &  Err.Description & vbCrLf
            End If
        End If     
    Next
    Set objFile = Nothing

    ' *** STEP 2 *** 'Now that we've processed files, repeat for subdirectories 
    For Each subf In objFolder.SubFolders
    'some folders can't/shouldn't be checked - 
    '16 is a normal folder, 32 is an archive, 1046 is symbolic, etc
        If subf.Attributes ="16" Then
                suckTheData objFSO, fFile, subf
        End If
    Next
    Set subf = Nothing

End Sub