USBMaster - Рулим флешками в офисе
Хочу поделиться с Вами приладой для учета флешек.
Постановка задачи была следующая: существует утвержденный список сертифицированных флешек, которыми можно пользоваться и есть специалист по безопасности, который за это отвечает. С помощью этой прилады можно: спалить кого угодно на предмет втыкания в комп левых флешек, настроить все компы на использование флешек необходимым образом, удалить всю информацию из реестра об установленных флешках (тем самым прикрыв свою задницу в случае грядущей проверки из вышестоящей инстанции) и еще кое-что.
Скачать VBA и HTA версии можно здесь: http://da440dil.narod.ru/
VBA версию попробую вложить.
Код, конечно, некрасивый - не оптимизированный - тем не менее работает.
Пожалуйста, зацените. Жду Ваших комментариев :)
Угощайтесь там же: http://da440dil.narod.ru/
От себя скажу–молодец,что делаешь.Вот так вот кратко:)
От себя скажу–молодец,что делаешь.Вот так вот кратко:)
Спасибо, приятно от ветерана :)
Изините, наивно полагал, что это программирование на VB :). Наверное с правилами не ознакомился...
Бегло смотрел код, не запускал.
На первый взгляд, сделано неплохо.
Вам на заметку - с помощью WMI можно:
- "ловить" события подключения/отключения USB-накопителя;
- определять модель подключенного устройства и назначенное накопителю имя на текущей/удалённой станции без обращения к реестру;
- начиная с Vista, можно определять серийный номер накопителя (если, конечно, производитель позаботился о том, чтобы его "зашить" в ПЗУ).
Здесь: http://da440dil.narod.ru/ подробное описание + скрипты + HTA-приложение. Компилировать ни к чему :)
Вам на заметку - с помощью WMI можно:
Спасибо, Dmitrii, зайдите по-случаю на http://da440dil.narod.ru/ (если интересно) - там все подробно - реализовал все на что хватило :)
Microsoft PowerShell, VBScript and JScript. Bible
Автор: William R. Stanek, James O’Neill, Jeffrey Rosen
Год: 2009
Страниц: 915
Формат: pdf
Качество: 5+
Microsoft VBScript Step by Step
Автор: Ed Wilson
Год: 2006
Страниц: ?
Формат: chm, pdf
Качество: 5
Windows PowerShell
Автор: Франк Кох
Год: 2007
Страниц: 44
Формат: pdf
Качество: 5
Windows Script Host для Windows 2000/XP
Автор: Андрей Попов
Год: 2004
Страниц: 641
Формат: djvu
Качество: 5
Windows Script Technologies
Справочник на английском языке по Windows Script Host, JScript, VBScript
Администрирование Windows с помощью WMI и WMIC
Автор: Андрей Попов, Евгений Шишкин
Год: 2004
Страниц: 748
Формат: djvu
Качество: 5+
Введение в Windows PowerShell
Автор: Андрей Попов
Год: 2009
Страниц: 452
Формат: pdf
Качество: 4
Введение в WMI
Введение в Windows Management Instrumentation (WMI)
Командная строка Microsoft Windows. Справочник администратора.
Автор: Уильям Р. Станек
Год: 2004
Страниц: 500
Формат: pdf, djvu
Качество: 3
Командные файлы и сценарии Windows Script Host
Автор: Андрей Попов
Год: 2002
Страниц: 323
Формат: pdf
Качество: 5
Начала системного програмирования в среде MS-DOS7
Автор: Н.Г. Хитрово
Год: 2009
Страниц: 704
Формат: pdf
Качество: 5
Некоторые объекты Automation
CHM-файл справки на русском языке описывает свойства и методы объектов Windows Script Host, а также некоторых других объектов OLE Automation, доступных в административных скриптах Windows и приложениях, способных выступить в роли OLE-клиента. Кроме объектов Windows Script Host, в частности, описана работа с регулярными выражениями в VBScript, включая подробное описание метасимволов, а также свойства и методы объектов "Shell.Application" и "Scripting.Dictionary". Многочисленные примеры приведены на языке VBScript. Также прилагается справка по встроенным константам и функциям языка VBScript. В файле справки имеется хорошо структурированное оглавление и полнотекстовый поиск.
Объекты InternetExplorer и WebBrowser
Небольшой CHM-файл справки на русском языке описывает свойства, методы и события объектов InternetExplorer и WebBrowser с точки зрения работы с обозревателем как с OLE-Automation сервером из различных скриптовых сред или Visual Basic. Приведены примеры кода на языке VBScript. В файле справки имеется оглавление и полнотекстовый поиск.
Руководство разработчика на Windows Script Host 2.0
Автор: Гюнтер Борн
Год: 2001
Страниц: 479
Формат: djvu
Качество: 4
Скрипты для администратора Windows
Автор: Джесси Торрес
Год: 2002
Страниц: 338
Формат: djvu
Качество: 4
Справочник параметров командной строки
CHM-файл справки
Программирование на языке Microsoft Visual Basic Scripting Edition
Автор: А.С. Грошев
Год: 2009
Страниц: 85
Формат: pdf
Качество: 5
Адрес тот же :)
Угощаемся по тому же адресу :)
В случае отсутствия флешки в списке разрешенных, скрипт либо извлекает ее, либо форматирует до тех пор, пока она не будет извлечена :)
Доступно для скачивания по тому же адресу.
- devcon.exe отсутствует в Windows по умолчанию (входит в состав пакета Driver Development Kit), а предусмотренный ранее вспомогательный метод - форматирование "левых" флешек - оказался не "кошерным" :), поэтому добавил возможность извлечения флешек, используя функции kernel32.dll
- т.к. из скрипта достучаться до API-функций проблематично, пришлось скопмилировать отдельную приладу для выплевывания флешек - USBSpit.exe, которая получает буквы разделов USB-устройства в качестве параметра
- добавил возможность ведения журнала монитора - когда какие USB-устройства втыкали, успешно или неудачно, формат - с разделителем ";" - удобно для формирования отчета
- используя монитор исчезает необходимость прописывать "правильные" флешки на каждом компьютере, достаточно сохранить их серийники в "базе"
- с целью исключения возможности отключения процесса мониторинга, добавил возможность запрета использования диспетчера задач
Запятая не нужна.А вот это вы зря–ДЗ очень полезная штука.Есть иные,более либеральные методы
После начала эксплуатации первых версий приложения пользователи первым делом полезли в ДЗ и были удивлены, не обнаружив там "левых" процессов.
Позднее реализовал альтернативный метод - мониторинг. Убежден, что пользователи первым делом снова полезут в ДЗ и некоторые обнаружат процесс wscript.exe. К своему стыду, я не знаком с "более либеральными методами" скрыть этот процесс. Поделитесь - буду признателен.
Понимаю, что запрет ДЗ выглядит наивно (как и в целом приложение на VBScript). Считаю это способом "погрозить пальчиком" любопытному пользователю :)
не знаю, все это безобразие рисовалось с расчетом на гетерогенную среду: сеть - местами, админы - тоже, как правило приходилось работать в подобных условиях :)
понятно, что у юзеров прав должно быть как можно меньше, но более-менее нормальное администрирование встречается крайне редко (может это только мне так не повезло :) ?)
Впрочем и этот способ хорош только до тех пор, пока пользователь не догадается, что за его станцией ведётся удалённое наблюдение. После чего ничто не помешает ему на время манипуляций с "флешками" отключать сетевое соединение. Пока нет связи можно и нужные манипуляции сделать, и реестр почистить.
Так я вроде такую возможость реализовал.
Скрипт USBMonitor залетает в логон-скрипт текущего юзера и каждые 2 секунды пасет через WMI возникновение события поключения USB-устройств
В случае возникновения события:
- вытаскивает серийник подключенного устройства
- сравнивает его с "базой"
- если такого серийника нет в базе - запускает USBSpit - "плевалку"
- если есть - здрасте вам
- пишет событие в лог
У меня и лог, и "база", и скрипт находятся на локальном компе юзера.
В Вашем случае можно до кучи добавить мониторинг наличия сетевого подключения, чтобы при выдергивании сетевого кабеля юзера выбрасывало из системы
- добавил возможность запрета использования редактора рееста (довесок к запрету использования диспетчера задач - скорее для симметрии :))
Скрипт USBMonitor залетает в логон-скрипт текущего юзера и каждые 2 секунды пасет через WMI возникновение события поключения USB-устройств
Не видел такого фрагмента в наборе сценариев (впрочем, не там, вероятно, смотрел).
Для разнообразия предлагаю взглянуть на такой сценарий идентификации мобильных накопителей:
'с физическими устройствами.
'Типы съёмных накопителей, на работу с которыми ориентирован сценарий:
'Flash-диски, Flash-карты, ZIP-диски.
'Сценарий может работать и в консольном, и в графическом режимах.
Dim objWMI, objLogicalDisks, objLD
Dim objPartitions, objPart, objDrives, objDrive, objFS
Dim strComputer, strTranslator, strList, strTemp, blnIsConsole
strComputer = ".": strList = vbNullString
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
Set objFS = Nothing
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
blnIsConsole = True
Else
blnIsConsole = False
End If
Set objWMI = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")
Set objLogicalDisks = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=2")
For Each objLD In objLogicalDisks
Set objPartitions = objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & _
objLD.DeviceID & _
"""} WHERE AssocClass=Win32_LogicalDiskToPartition")
For Each objPart In objPartitions
Set objDrives = objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
objPart.DeviceID & _
"""} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
For Each objDrive In objDrives
strTemp = objLD.DeviceID & " => " & objDrive.Caption & _
" (Диск " & objDrive.Index & ")"
strList = strList & strTemp & vbNewLine
If blnIsConsole Then WScript.Echo strTemp
Next
Set objDrive = Nothing
Set objDrives = Nothing
Next
Set objPart = Nothing
Set objPartitions = Nothing
Next
Set objLD = Nothing
Set objLogicalDisks = Nothing
Set objWMI = Nothing
If Len(strList) = 0 Then
WScript.Echo "Накопителей указанного типа не обнаружено."
End If
If Not blnIsConsole Then WScript.Echo strList
WScript.Quit 0
Если есть необходимость, то могу подсказать, как из сценария управлять безопасностью NTFS.
- добавил альтернативный способ запрета установки USB-устройств при помощи таблиц контроля доступа - как советуют мелкомягкие
- добавил возможность запрета использования оснастки "Локальные пользователи и группы", чтобы исключить возможность отключения логон-скрипта
- добавил проверку принадлежности пользователя к группе локальных администраторов при запуске приложения
- изменил процедуру запуска - теперь запускается быстрее - мухи отдельно (сначала интерфейс) - котлеты отдельно (потом процедуры сбора данных) :)
- добавил всплывающую подсказку для каждого задания - нарядную - полупрозрачную :)
Угощайтесь, сообщайте о косяках :)
Не видел такого фрагмента в наборе сценариев (впрочем, не там, вероятно, смотрел).
В сценарии USBMonitor.vbs
Для разнообразия предлагаю взглянуть на такой сценарий идентификации мобильных накопителей:
Сопоставление логических томов физическим у меня происходит так:
Function USBGetLet(USBDevID)
Dim dskLetters() 'массив букв дисков
Set wmiServices = GetObject("winmgmts:\\.\root\cimv2")
Set wmiDiskPartitions = wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
& USBDevID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
i = 0
For Each wmiDiskPartition In wmiDiskPartitions 'идем по разделам
'каждый раздел ассоциируем с логическим диском
Set wmiLogicalDisks = wmiServices.ExecQuery _
("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
& wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For Each wmiLogicalDisk In wmiLogicalDisks
ReDim Preserve dskLetters(i)
dskLetters(i) = wmiLogicalDisk.DeviceID
Next
Next
USBGetLet = dskLetters
Set wmiLogicalDisks = Nothing
Set wmiDiskPartitions = Nothing
Set wmiServices = Nothing
End Function
Опа, по-ходу тот же код, что у Вас, только пуговицы наружу :). У меня по-предметнее разбито - надо том - давай ID, по-функциональнее чтоли - но это от задач зависит - просто для решения моих надо так - WMI-запросы одинаковые
Если есть необходимость, то могу подсказать, как из сценария управлять безопасностью NTFS.
Не мешало бы. В последней версии реализовал через CACLS. Получилось не очень. Попробовал через wshShell.Exec - некрасиво - окошко cmd мелькает. Пришлось через wshShell.Run - разрешения NTFS вытаскивать в файл - читать из файла - удалять файл - хлопотно. Знаете как проще? Расскажите.
Вот пример:
Dim objShell, strPath, strComputer
Dim objWMI, objSecSettings, objSD, objACE
Dim objSID, objTrustee, objNewACE, arrACE
Dim arrSIDs, arrDomains, arrNames, arrHasACE(), blnHasACE, strTemp, intTemp, i
Const ACCESS_ALLOWED_ACE_TYPE = 0 'Флаг-признак записи типа "РАЗРЕШЕНИЕ"
Const ACCESS_DENIED_ACE_TYPE = 1 'Флаг-признак записи типа "ЗАПРЕТ"
Const FULL_ACCESS = 2032127 'Маска разрешения "Полный доступ"
Const SE_DACL_PROTECTED = 4096 'Флаг-признак наследования управляемым объектом безопасности NTFS от "родителя"
strComputer = "."
Set objShell = CreateObject("Shell.Application")
strPath = objShell.NameSpace(&h24).Self.Path & "\Inf\Usbstor.inf"
Set objShell = Nothing
arrSIDs = Array("S-1-5-32-544", "S-1-5-18")
arrDomains = Array("BUILTIN", "NT AUTHORITY")
arrNames = Array("Администраторы", "System")
ReDim arrHasACE(UBound(arrSIDs))
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'")
If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then 'Чтение содержимого дескриптора безопасности файла
If Not IsNull(objSD.DACL) Then 'Проверка наличия хотя бы одной записи в DACL файла
'--- Отключение наследования настроек безопасности от "родителя"
If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
intTemp = objSecSettings.SetSecurityDescriptor(objSD)
End If
'------
If intTemp = 0 Then
'--- Просмотр DACL для настройки типов и масок уже существующих записей
For Each objACE In objSD.DACL
strTemp = objACE.Trustee.SIDString
blnHasACE = False
For i = 0 To UBound(arrSIDs)
If StrComp(strTemp, arrSIDs(i), vbTextCompare) = 0 Then
arrHasACE(i) = True
blnHasACE = True
intTemp = intTemp + 1
End If
Next
If blnHasACE Then
'Назначение разрешения на полный доступ
objACE.AceType = ACCESS_ALLOWED_ACE_TYPE
objACE.AccessMask = FULL_ACCESS
Else
'Назначение нулевой маски доступа для последующего автоматического удаления записи
objACE.AccessMask = 0
End If
Next
'------
'--- Проверка необходимости добавления в DACL дополнительных записей
If intTemp <= UBound(arrHasACE) Then
arrACE = objSD.DACL 'Подготовка к расширению DACL
For i = 0 To UBound(arrHasACE)
If Not arrHasACE(i) Then
'--- Формирование нового экземпляра класса Win32_Ace
Set objSID = objWMI.Get("Win32_SID.SID='" & arrSIDs(i) & "'")
Set objTrustee = objWMI.Get("Win32_Trustee").Spawninstance_()
objTrustee.Domain = arrDomains(i)
objTrustee.Name = arrNames(i)
objTrustee.SID = objSID.BinaryRepresentation
objTrustee.SidLength = objSID.SidLength
objTrustee.SIDString = arrSIDs(i)
Set objSID = Nothing
Set objNewACE = objWMI.Get("Win32_Ace").Spawninstance_()
objNewACE.AceType = ACCESS_ALLOWED_ACE_TYPE
objNewACE.AccessMask = FULL_ACCESS
objNewACE.Trustee = objTrustee
'------
Set objTrustee = Nothing
'--- Расширение DACL
ReDim Preserve arrACE(UBound(arrACE) + 1)
Set arrACE(UBound(arrACE)) = objNewACE
'------
Set objNewACE = Nothing
End If
Next
objSD.DACL = arrACE
Erase arrACE
End If
'------
intTemp = objSecSettings.SetSecurityDescriptor(objSD) 'Попытка сохранения внесённых в DACL изменений
If intTemp = 0 Then
WScript.Echo "Настройка безопасности для файла " & UCase(strPath) & " выполнена."
Else
WScript.Echo "Настройка безопасности для файла " & UCase(strPath) & " не выполнена." & vbNewLine & _
"Код ошибки: " & intTemp
End If
Else
WScript.Echo "Не удалось отключить наследование безопасности для файла " & UCase(strPath)
End If
Else
WScript.Echo "Список управления доступом к файлу " & UCase(strPath) & " пуст."
End If
Else
WScript.Echo "Не удалось прочитать дескриптор безопасности файла " & UCase(strPath)
End If
Set objSD = Nothing
Set objSecSettings = Nothing
Set objWMI = Nothing
WScript.Quit 0
Примечания.
1. Сценарий проверен на русифицированной Win XP Pro.
2. Для успешной работы требуются полномочия локального администратора.
3. Следует учесть, что в русифицированной Win 7 "учётка" локальной системы называется по-русски "Система", а не как в предыдущих версиях "System".
Не знаю, проще ли это...Я вот решил через CALCS и Shell.ShellExecute попробовать...Но Ваш листинг мне понравился, обязательно подробно разберу.
Спасибо. Кроме управлениея автозапуском здесь еще кое-что реализовано, и не shareware ;)
Dmitrii, хочу еще раз поблагодарить Вас за пример. Вкуснейшая вещь. Не смотря на то, что пришлось потратить немало времени (вчера весь вечер, да и до сих пор еще докуриваю - раскладываю на своем чердаке по полкам :)) - из Вашего листинга я звял на вооружение ряд интересных, иногда даже неожиданных (для меня) приемов. Спасибо.
- работает на Windows XP, Vista, 7
USBMaster 2.0 beta1: http://da440dil.narod.ru/download.html
А для полного счастья не хватает немного - скрестить монитор с USBSprit.exe - сделать это маленьким, невидимым и неубиваемым...
Про работу по сети я пока умолчу :-)
Хорошо бы еще добавить исходник USBSprit.exe
Пару месяцев назад пытался найти исходник USBSpit.exe - не получилось. Может удалил случайно... Найду - выложу.
Писал сам, честно :). На VB6. Пока авторство можно определить по свойствам файла - "производитель".
А для полного счастья не хватает немного - скрестить монитор с USBSprit.exe - сделать это маленьким, невидимым и неубиваемым..
Коммерческий продукт получится :). Нужен интерес ;)
Про работу по сети я пока умолчу :-)
Пожалуйста, не "умалчивайте", расскажите все как есть. Обнаруженные косяки по случаю исправлю.
Про проблему подключения по сети можно почитать здесь.
USBMaster 2.0 beta1: http://da440dil.narod.ru/download.html
я бы с удовольствием, тем более что сам занимаюсь решением схожей задачи на vbs с использованием wmi, но ваша страница недоступна(находится на реконструкции) :-(((
Я для "скрытости" создаю постоянную подписку на событие "вставка флешки", ID пишу в SQL.
как дополнительное средство пришлось проверять уже вставленные флешки при загрузке.
на компьютеры все это закидываю через политику
неубиваемость можно попробовать реализовать через ту же постоянную подписку wmi. отслежваем удаление нашей подписки и создаем ее заново.
исходники USBSprit.exe заинтересовали.