Критический анализ OSPP.VBS


Только в 1992 году они наняли 3100 человек, и, вы же понимаете, не все из них гении.

Открыл из любопытства исходный код «сценария платформы защиты программного обеспечения Office» (OSPP.VBS) и был удивлен следующими моментами:

  1. Отсутствие Option Explicit в начале скрипта дает «зеленый свет» ошибкам, связанным с неверным написанием идентификаторов.
  2. Автор скрипта работает с файловыми путями как с обычными строками, хотя для этого есть соответствующие методы FileSystemObject:
    • определяет путь к папке посредством разбора строки,
      currentDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\"))

      а можно было использовать стандартный метод GetParentFolderName

      currentDir = objFSO.GetParentFolderName(WScript.ScriptFullName)
    • определяет имя файла посредством разбора строки,
      strEngine = LCase(Right(WScript.FullName,12))

      не используя стандартный метод GetFileName

      strEngine = LCase(objFSO.GetFileName(WScript.FullName))
    • «склеивает» файловый путь из строк,
      verifyFileExists currentDir & "ospp.htm"
      

      хотя это можно было сделать с помощью метода BuildPath

      verifyFileExists objFSO.BuildPath(currentDir, "ospp.htm")
      
    • Функция registerMof — это развернутый пример по теме «Как не надо делать».
      Function registerMof(strFile)
      
      For Each Drv In objFSO.Drives
          If Drv.DriveType=2 Then
              If objFSO.FileExists(Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe") Then
                  foundComp = True
                  strMofExePath = Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe"
                  If objFSO.FileExists(Drv.DriveLetter & STR_SYS32PATH & "wbem\" & strFile) Then
                      foundMof = True
                      strOWmi = Drv.DriveLetter & STR_SYS32PATH & "wbem\" & strFile
                      Set objScriptExec = WshShell.Exec (strMofExePath & " " & strOWmi)
                      readOut = objScriptExec.StdOut.ReadAll
                      WScript.Echo readOut
                      quitExit()
                  End If
              End If
          End If
      Next
      
      If foundComp <> True Then
          globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\mofcomp.exe",True
      Else
          If foundMof <> True Then
              globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\osppwmi.mof",True
          End If
      End If
      
      End Function
      • Автор ищет файл mofcomp.exe на всех дисках, хотя нужен только системный том
        For Each Drv In objFSO.Drives
        ...
        
      • Имя каталога установки Windows задано строковой константой, хотя правильнее определить его, например, с помощью переменной окружения %WinDir% или %SystemRoot%
        CONST STR_SYS32PATH = ":\Windows\System32\"
        
      • Повторно вычисляется одно и то же выражение, хотя можно было сразу присвоить значение переменной
        Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe"
      • Файловый путь «склеивается» как обычная строка, несмотря на то, что для этого есть стандартный метод
        strMofExePath = Drv.DriveLetter & STR_SYS32PATH & "wbem\mofcomp.exe"
        

      С учетом вышеизложенных замечаний функция registerMof могла бы выглядеть так:

      Function registerMof(strFile)
      
      WinDir = WshShell.ExpandEnvironmentStrings("%WinDir%")
      WbemDir = objFSO.BuildPath(WinDir, "System32\wbem")
      strMofExePath = objFSO.BuildPath(WbemDir, "mofcomp.exe")
      If objFSO.FileExists(strMofExePath) Then
        foundComp = True
        strOWmi = objFSO.BuildPath(WbemDir, strFile)
        If objFSO.FileExists(strOWmi) Then
          foundMof = True
          Set objScriptExec = WshShell.Exec (strMofExePath & " " & strOWmi)
            readOut = objScriptExec.StdOut.ReadAll
            WScript.Echo readOut
            quitExit()
        End If
      End If
      
      If foundComp <> True Then
          globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\mofcomp.exe",True
      Else
          If foundMof <> True Then
              globalPopFailure MSG_FILENOTFOUND & Replace(STR_SYS32PATH,":","") & "wbem\osppwmi.mof",True
          End If
      End If
      
      End Function
Реклама
Запись опубликована в рубрике scripting с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s