Пишет timon_crazy ([info]timon_crazy)
@ 2007-03-21 15:34:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Скрипт на VBS
Скрипта который долго ждали большефики.
Юзайте, комментируйте.


'************************************************************************

'* Folder v.02 (универсальный)
'* Скрипт на VBS
'* OS: Win2K server, Win2K Prof,  WinXp SP1,  WinXpSp2
'************************************************************************
' Состав поставки:
'                  folder.vbs - сам скрипт.
'                  folder.txt - файл настроек каталогов сканирования
'************************************************************************
' Скрипт распостраняется по принципу "Как есть". Автор скрипта не несет
' не какой отвественности,  и не зачто не отвечает.
' Условия лицензирования: GPL 2.0
' При изменении любого участка скрипта следует уведомить автора,  т.е. меня
' об изменениях в коде.
' Распостраннение: разрешается любое бесплатное распостранение любым способом
' с сохранением оригинального скрипта. В случае распостранения/использывания
' модификаций следует указать ссылку на оригинальный скрипт,  и вкладывать
' оригинал в комплект.
' Чтото не понятно? чтото хотите поправить? нашли ошибку? пишите.
'************************************************************************
'* Скрипт построения дерева папок с указанного места,  с указанием прав
'* доступа на каждую папку.
'* Автор: Дмитрий 'Timon_Crazy' Малыхин
'* E-mail: wct@gorodok.net
'* Blog: http://timon-crazy.livejournal.com/
'************************************************************************
'Процедура получения прав определенной папки,  файла
'Вариант для короткой версии
'Построенно на примере от MS
Sub Dasl_mini (strFileName)
 SE_DACL_PRESENT = &h4
 ACCESS_ALLOWED_ACE_TYPE = &h0
 ACCESS_DENIED_ACE_TYPE  = &h1

 FILE_ALL_ACCESS       = &h1f01ff
 FILE_APPEND_DATA      = &h000004
 FILE_DELETE           = &h010000
 FILE_DELETE_CHILD     = &h000040
 FILE_EXECUTE          = &h000020
 FILE_READ_ATTRIBUTES  = &h000080
 FILE_READ_CONTROL     = &h020000
 FILE_READ_DATA        = &h000001
 FILE_READ_EA          = &h000008
 FILE_SYNCHRONIZE      = &h100000
 FILE_WRITE_ATTRIBUTES = &h000100
 FILE_WRITE_DAC        = &h040000
 FILE_WRITE_DATA       = &h000002
 FILE_WRITE_EA         = &h000010
 FILE_WRITE_OWNER      = &h080000

 Set objWMIService = GetObject("winmgmts:")
 Set objFileSecuritySettings = _
 objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'")
 intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)
 intControlFlags = objSD.ControlFlags
 if intControlFlags AND SE_DACL_PRESENT Then
   arrACEs = objSD.DACL
   For Each objACE in arrACEs
    TFm.Write "<br>Пользователь: <FONT COLOR=""GREEN"">"&objACE.Trustee.Domain & "\" & objACE.Trustee.Name&"</FONT><br>"
    If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
     TFm.Write vbTab & "Разрешенно:<br>"
    ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
     TFm.Write vbTab & "Запрещенно:<br>"
    End If
    If objACE.AccessMask AND FILE_ALL_ACCESS Then
     TFm.Write vbTab & vbTab & "Полный доступ<br>"
    End If
    If objACE.AccessMask AND FILE_APPEND_DATA Then
     TFm.Write vbTab & vbTab & "Создание папок / Дозапись новых файлов<br>"
    End If
    If objACE.AccessMask AND FILE_DELETE Then
     TFm.Write vbTab & vbTab & "Удаление<br>"
    End If
    If objACE.AccessMask AND FILE_DELETE_CHILD Then
     TFm.Write vbTab & vbTab & "Удалять вложенние<br>"
    End If
    If objACE.AccessMask AND FILE_EXECUTE Then
     TFm.Write vbTab & vbTab & "Запуск файла<br>"
    End If
'Если Вам нужны эти права раскоментируйте
''      If objACE.AccessMask AND FILE_READ_ATTRIBUTES Then
''         TFm.Write vbTab & vbTab & "Чтение атрибутов<br>"
''      End If
''      If objACE.AccessMask AND FILE_READ_CONTROL Then
''         TFm.Write vbTab & vbTab & "FILE_READ_CONTROL <br>"
''      End If
      If objACE.AccessMask AND FILE_READ_DATA Then
         TFm.Write vbTab & vbTab & "Чтение<br>"
      End If
''      If objACE.AccessMask AND FILE_READ_EA Then
''         TFm.Write vbTab & vbTab & "FILE_READ_EA <br>"
''      End If
''      If objACE.AccessMask AND FILE_SYNCHRONIZE Then
''         TFm.Write vbTab & vbTab & "FILE_SYNCHRONIZE <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_ATTRIBUTES Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_ATTRIBUTES <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_DAC Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_DAC <br>"
''      End If
      If objACE.AccessMask AND FILE_WRITE_DATA Then
         TFm.Write vbTab & vbTab & "Запись<br>"
      End If
''      If objACE.AccessMask AND FILE_WRITE_EA Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_EA <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_OWNER Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_OWNER <br>"
''      End If
   Next
Else
   TFm.Write "Не возможно получить данные<br>"
End If

End Sub

Sub Dasl_all (strFileName)
'strFileName = objSubFolder.Path
SE_DACL_PRESENT = &h4
ACCESS_ALLOWED_ACE_TYPE = &h0
ACCESS_DENIED_ACE_TYPE  = &h1

FILE_ALL_ACCESS       = &h1f01ff
FILE_APPEND_DATA      = &h000004
FILE_DELETE           = &h010000
FILE_DELETE_CHILD     = &h000040
FILE_EXECUTE          = &h000020
FILE_READ_ATTRIBUTES  = &h000080
FILE_READ_CONTROL     = &h020000
FILE_READ_DATA        = &h000001
FILE_READ_EA          = &h000008
FILE_SYNCHRONIZE      = &h100000
FILE_WRITE_ATTRIBUTES = &h000100
FILE_WRITE_DAC        = &h040000
FILE_WRITE_DATA       = &h000002
FILE_WRITE_EA         = &h000010
FILE_WRITE_OWNER      = &h080000

Set objWMIService = GetObject("winmgmts:")
Set objFileSecuritySettings = objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'")
intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)

intControlFlags = objSD.ControlFlags

If intControlFlags AND SE_DACL_PRESENT Then
   arrACEs = objSD.DACL
   For Each objACE in arrACEs
''      WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
TF.Write "<br>Пользователь: <FONT COLOR=""GREEN"">"&objACE.Trustee.Domain & "\" & objACE.Trustee.Name&"</FONT><br>"
      If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
''         WScript.Echo vbTab & "Allowed:"
TF.Write vbTab & "Разрешенно:<br>"
      ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
''         WScript.Echo vbTab & "Denied:"
TF.Write vbTab & "Запрещенно:<br>"
      End If
      If objACE.AccessMask AND FILE_ALL_ACCESS Then
         TF.Write vbTab & vbTab & "Полный доступ<br>"
      End If
      If objACE.AccessMask AND FILE_APPEND_DATA Then
         TF.Write vbTab & vbTab & "Создание папок / Дозапись новых файлов<br>"
      End If
      If objACE.AccessMask AND FILE_DELETE Then
         TF.Write vbTab & vbTab & "Удаление<br>"
      End If
      If objACE.AccessMask AND FILE_DELETE_CHILD Then
         TF.Write vbTab & vbTab & "Удалять вложенние<br>"
      End If
      If objACE.AccessMask AND FILE_EXECUTE Then
         TF.Write vbTab & vbTab & "Запуск файла<br>"
      End If
''      If objACE.AccessMask AND FILE_READ_ATTRIBUTES Then
''         TFm.Write vbTab & vbTab & "Чтение атрибутов<br>"
''      End If
''      If objACE.AccessMask AND FILE_READ_CONTROL Then
''         TFm.Write vbTab & vbTab & "FILE_READ_CONTROL <br>"
''      End If
      If objACE.AccessMask AND FILE_READ_DATA Then
         TF.Write vbTab & vbTab & "Чтение<br>"
      End If
''      If objACE.AccessMask AND FILE_READ_EA Then
''         TFm.Write vbTab & vbTab & "FILE_READ_EA <br>"
''      End If
''      If objACE.AccessMask AND FILE_SYNCHRONIZE Then
''         TFm.Write vbTab & vbTab & "FILE_SYNCHRONIZE <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_ATTRIBUTES Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_ATTRIBUTES <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_DAC Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_DAC <br>"
''      End If
      If objACE.AccessMask AND FILE_WRITE_DATA Then
         TF.Write vbTab & vbTab & "Запись<br>"
      End If
''      If objACE.AccessMask AND FILE_WRITE_EA Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_EA <br>"
''      End If
''      If objACE.AccessMask AND FILE_WRITE_OWNER Then
''         TFm.Write vbTab & vbTab & "FILE_WRITE_OWNER <br>"
''      End If
   Next
Else
   TF.Write "Не возможно получить данные<br>"
End If

End Sub

'Вывод полной версии отчета
Sub ShowSubFolders(objFolder)
  Set colFolders = objFolder.SubFolders
  For Each objSubFolder In colFolders
   TF.Write "<br> Папка: <b>"&objSubFolder.Path&"</b><br>"
   Dasl_all   (objSubFolder.Path)
   TF.Write "<br>"
   Set colFiles = objSubFolder.Files
   For Each objFile In colFiles
   Next
   ShowSubFolders(objSubFolder)
  Next
End Sub

'Вывод краткой версии отчета
Sub mini_ShowSubFolders(objFolder)
  Set colFolders = objFolder.SubFolders
  For Each objSubFolder In colFolders
'    WScript.Echo objSubFolder.Path
   TFm.Write "<br>Папка: <b>"&objSubFolder.Path&"</b><br>"
   Dasl_mini  (objSubFolder.Path)
   TFm.Write "<br>"
   Set colFiles = objSubFolder.Files
  Next
End Sub

Sub all_write (str_print)
 if full = 1 then
  TF.Write str_print
 End if
 if mini =1 then
  TFm.Write str_print
 End if
End Sub

'Основная функция
full = 1 'Выводит отчет полной версии
mini = 1 'Выводит краткий отчет
'^Тут явная бага.
'но как то работает. будет фичей пока ктонить ен поправит

WScript.Echo "Скрипт показа прав на папки в файло-хранилище. v.0.2 (универсальный)"
Dim folder
Set FSO = CreateObject("Scripting.FileSystemObject")
Set txtStream = fso.OpenTextFile("folder.txt")
Set FSO = CreateObject("Scripting.FileSystemObject")
Const FOR_READING = 1
fname = "folder_"&Date()&".htm"
if full = 1 then
 Set TF = FSO.CreateTextFile("all_"&fname)
End if
if mini = 1 then
 Set TFm = FSO.CreateTextFile("mini_"&fname)
End if
Set patch_f = fso.GetFolder(".") 
all_write ("<html>")
all_write ("<head>")
if full = 1 then
 TF.Write "<title>Полный Список прав на дерево директорий файлового сервера "&Date()&"</title>"
End if
if mini = 1 then
 TFm.Write "<title>Краткий Список прав на дерево директорий файлового сервера "&Date()&"</title>"
End if
all_write ("</head>")
all_write ("<body>")
if full = 1 then
 TF.Write  "<b>Полный Cписок прав на дерево директорий файлового сервера по состоянию на "&Date()&"</b>"
End if
if mini = 1 then
 TFm.Write "<b>Краткий Cписок прав на дерево директорий файлового сервера по состоянию на "&Date()&"</b>"
End if
if full = 1 then
 TF.Write  "<br>Краткий список можно просмотреть <a href=""file://"&patch_f&"\mini_"&fname&""">mini_"&fname&"</a>"
End if
if mini = 1 then
 TFm.Write "<br>Полный список можно просмотреть <a href=""file://"&patch_f&"\all_"&fname&""">all_"&fname&"</a>"
End if
all_write ("<hr>")
Do While Not (txtStream.atEndOfStream)
str = txtStream.ReadLine
all_write  ("<br><br><b>Файл сервер <a href=""file://"&str&""">"&str&"</a></b><br>")
'Получение списка
strFolder = str
Set objFolder = FSO.GetFolder(strFolder)
Set colFiles = objFolder.Files
For Each objFile In colFiles
Next
if full = 1 then
 ShowSubFolders(objFolder)
End if
if mini = 1 then
 mini_ShowSubFolders(objFolder)
End if
Loop
all_write ("<hr><i>Файл сгенерирован "&Date()&" "&Time()&"</i>")
all_write ("</body>")
all_write ("</html>")
WScript.Echo "Готово. Результат находиться в файлах all_"&fname&" и mini_"&fname

Dim objShell
Set objShell = CreateObject("WScript.Shell")

if full = 1 then
 objShell.Run "IEXPLORE "&patch_f&"\mini_"&fname
End if
if mini = 1 then
 objShell.Run "IEXPLORE "&patch_f&"\all_"&fname
End if

WScript.Quit



Скачать с примерами можно тут - внешка