Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт поиска файлов по расширению (http://forum.oszone.net/showthread.php?t=240721)

Rusya89 16-08-2012 15:33 1971309

Скрипт поиска файлов по расширению
 
Всем доброго дня.

Встала задача найти на локальных дисках сервера все файлы *.avi, *.mp3 и т.д. с полным путем к файлу а так же время его создания и username пользователя кто записал данный файл.
Вид примерно такой

16-08-2012 usename D:\Share\music.mp3

На форуме нашел что то подобное и хочу взять за основу, но в данном примере скрипт ищет на всех локальных дисках и выводит только путь к файлу и имя компьютера.

Код:

strFile = "C:\FileList.txt"

Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWSS = CreateObject("WScript.Shell")

Set colItem = objWMI.ExecQuery("SELECT DeviceID From Win32_LogicalDisk Where DriveType=3")
For Each objItem In colItem
  strDRV=strDRV &"Drive='"& objItem.DeviceID &"' OR "
Next

strSELECT="SELECT Name From CIM_DataFile Where ("& Left(strDRV,Len(strDRV)-4) &") AND ("& _
  "Extension='AVI' OR " & _
  "Extension='MP3' OR " & _
  "Extension='WMA' OR " & _
  "Extension='MPG' OR " & _
  "Extension='MP4')"

Set colItem = objWMI.ExecQuery(strSELECT)
Set objFile = objFSO.OpenTextFile(strFile,2,vbTrue)

objFile.WriteLine objWSS.ExpandEnvironmentStrings("%ComputerName%"& vbCRLF)
For Each objItem In colItem
  objFile.WriteLine(objItem.Name)
Next

objFile.Close


DmitriiV 16-08-2012 16:50 1971346

Для определения даты создания файла используйте свойство CreationDate:
Код:

objFile.WriteLine(objItem.CreationDate & " " &  objItem.Name)
Если "username пользователя" - это имя владельца объекта, то вот пример функции для определения владельца:
Код:

Function Get_Owner_FSO(strPath)
Dim objWMI, objSecSettings, objSD, objFS
Dim strPathWMI, strResult, strTemp
strPathWMI = Replace(strPath, "\", "\\", 1, -1, vbTextCompare)
On Error Resume Next
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")
If Err.Number = 0 Then
    Set objFS = CreateObject("Scripting.FileSystemObject")
    strTemp = objFS.GetDrive(Left(strPath, 2)).FileSystem
    Set objFS = Nothing
    If Err.Number = 0 Then
        If StrComp(strTemp, "NTFS", vbTextCompare) = 0 Then
            Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPathWMI & "'")
            If Err.Number = 0 Then
                If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
                    strResult = objSD.Owner.Domain & "\" & objSD.Owner.Name
                Else
                    strResult = "Не удалось прочитать дескриптор безопасности объекта."
                End If
                Set objSD = Nothing
            Else
                strResult = "Ошибка " & Err.Number & " при обращении к объекту." & vbNewLine & Err.Description
                Err.Clear
            End If
            Set objSecSettings = Nothing
        Else
            strResult = "Файловая система " & UCase(strTemp) & " не поддерживается."
        End If
    Else
        strResult = "Ошибка " & Err.Number & " при определении типа файловой системы." & vbNewLine & Err.Description
        Err.Clear
    End If
Else
    strResult = "Ошибка " & Err.Number & " при подключении к WMI-пространству." & vbNewLine & Err.Description
    Err.Clear
End If
Set objWMI = Nothing
On Error GoTo 0
Get_Owner_FSO = strResult
End Function


DmitriiV 16-08-2012 17:10 1971360

Совсем было забыл, что значение свойства CreationDate нужно предварительно преобразовать:
Код:

strTemp = objItem.CreationDate
objFile.WriteLine(Mid(strTemp, 7, 2) & "-" & Mid(strTemp, 5, 2) & "-" & Left(strTemp, 4) & " " &  objItem.Name)


Iska 16-08-2012 17:41 1971375

Пробуйте:
читать дальше »
Код:

Option Explicit

Dim strComputer

Dim objSWbemDateTime
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx_Win32_LogicalDisk
Dim objSWbemObjectEx_Win32_SID
Dim objSWbemObjectEx_CIM_DataFile

Dim strDrivesCondition
Dim strExtensionsCondition
Dim strExtension


strComputer = "."

Set objSWbemDateTime = WScript.CreateObject("WbemScripting.SWbemDateTime")

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

' Drives condition
strDrivesCondition = ""

For Each objSWbemObjectEx_Win32_LogicalDisk In objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_LogicalDisk WHERE DriveType=3")
        strDrivesCondition = strDrivesCondition & "Drive = '" & objSWbemObjectEx_Win32_LogicalDisk.Name & "' OR "
Next

strDrivesCondition = Left(strDrivesCondition, Len(strDrivesCondition) - Len(" OR "))

' Extensions condition
strExtensionsCondition = ""

For Each strExtension In Array("avi", "MP3", "WMA", "MPG", "MP4")
        strExtensionsCondition = strExtensionsCondition & "Extension = '" & strExtension & "' OR "
Next

strExtensionsCondition = Left(strExtensionsCondition, Len(strExtensionsCondition) - Len(" OR "))


For Each objSWbemObjectEx_CIM_DataFile In objSWbemServicesEx.ExecQuery( _
        "SELECT CSName, Name, CreationDate From CIM_DataFile WHERE (" & strDrivesCondition & ") AND (" & strExtensionsCondition & ")")
       
        objSWbemDateTime.Value = objSWbemObjectEx_CIM_DataFile.CreationDate
       
        For Each objSWbemObjectEx_Win32_SID In objSWbemServicesEx.Get("Win32_LogicalFileSecuritySetting='" & objSWbemObjectEx_CIM_DataFile.Name & "'").Associators_("Win32_LogicalFileOwner", "", "Owner")
                WScript.Echo objSWbemObjectEx_CIM_DataFile.CSName, vbTab, objSWbemObjectEx_Win32_SID.ReferencedDomainName & "\" & objSWbemObjectEx_Win32_SID.AccountName, vbTab, objSWbemDateTime.GetVarDate, objSWbemObjectEx_CIM_DataFile.Name
        Next
Next

Set objSWbemServicesEx            = Nothing
Set objSWbemLocator              = Nothing

Set objSWbemDateTime              = Nothing

WScript.Quit 0


Rusya89 17-08-2012 10:48 1971678

Этот скрипт выводит сообщение для пользователя с кнопкой Ок все работает и вывод какой хотелось, как это все в файл запихать и выбор по дискам D:\ H:\ G:\ ?

Iska 17-08-2012 15:11 1971850

Цитата:

Цитата Rusya89
как это все в файл запихать »

Код:

cscript.exe //nologo "Путь\Мой скрипт.vbs">"Путь\Файл.txt"
Цитата:

Цитата Rusya89
и выбор по дискам D:\ H:\ G:\ ? »

Этого не было в начальном техзадании. Было сказано:
Цитата:

Цитата Rusya89
Встала задача найти на локальных дисках сервера все файлы *.avi, *.mp3 и т.д. …»



Откуда уверенность, что такие диски — «D:\ H:\ G:\» — наличествуют? А если каких-то нет? И что значит — «выбор по дискам»?

Rusya89 17-08-2012 16:13 1971894

Цитата:

Цитата Iska
Откуда уверенность, что такие диски — «D:\ H:\ G:\» — наличествуют? А если каких-то нет? И что значит — «выбор по дискам»? »

В смысле есть диски на которых открыт общий доступ и надо смотреть конкретно по ним кто куда сколько во сколько накопировал.

Iska 17-08-2012 21:02 1972057

Приведите здесь результаты исполнения (раздельно):
Код:

strComputer = "server"

For Each elem In GetObject("WinNT://" & strComputer & "/LanmanServer,FileService")
        WScript.Echo elem.Name, vbTab, elem.Path
Next

и:
Код:

strComputer = "server"

For Each elem In GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").InstancesOf("Win32_Share")
        WScript.Echo elem.Name, vbTab, elem.Type, vbTab, elem.Caption
Next

и укажите, какие ресурсы, из перечисленных, будут участвовать в поиске. Попробуем их отобрать.


Время: 21:10.

Время: 21:10.
© OSzone.net 2001-