Скрипт удаляет ярлык (или любой другой файл) с рабочего стола. При этом, поиск происходит во всех профилях пользователей.
Для Windows 7: C:\Users
Для Windows XP: C:\Documents and Settings
Для запуска использовать run.bat
Поиск ярлыка происходит по имени файла, которое задается константой FILTER_SC_NAME, т.е. перед запуском нужно задать имя удаляемого ярлыка в этой константе.
Скрипт в процессе работы создает лог файл log.txt (по умолчанию).
Скрипт получает список IP адресов (имен) компьютеров из файла list.txt (по умолчанию). В этом файле на каждой строке должен располагаться IP адрес компа или его имя.
Скрипт использует утилиту port_test.exe с помощью которой он отличает обычный комп от принтеров и других сетевых устройств. Для идентификации компьютера выполняется попытка подключения к порту 135/tcp (по умолчанию).
Поиск ярлыка на целевых компах выполняется через админскую шару C$, поэтому, необходимо быть администратором на целевых компах.
Перед входом на комп через админскую шару, скрипт пингует комп. Если комп не пингуется, то скрипт не полезет на комп.
Таким образом, для запуска удаления ярлыка нужно:
- Задать имя удаляемого ярлыка в константе FILTER_SC_NAME
- Задать список целевых компов в файле list.txt, на которых нужно удалять ярлык
Листинг
' Удаление ярлыка на рабочем столе во всех профилях пользователей по списку компьютеров ' т.е. заходим на каждый комп, смотрим в каждый профиль на рабочий стол и удаляем ярлык с помощью фильтра ' Только для рускоязычных ОС ' (c) Paf, 2013 ' Дата последнего изменения: 06.12.2013 Option Explicit ' Если True - то удаления ярлыка не происходит, а просто идет проверка, если False - удаляет Const READ_ONLY = False ' *** ' Фильтры для удаления ярлыка. В будущем расширю ' *** ' Имя файла ярлыка Const FILTER_SC_NAME = "Имя файла ярлыка.lnk" ' Метод получения списка компов: ' FILE - из файла ' PING - формирование пингованием Const INPUT_DATA = "FILE" ' Для метода получения списка компов через PING Const IP_BASE = "x.x." ' Название лог файла Const LOGFILE = ".\log.txt" ' Название файла со списком целевых компьютеров Const FILELIST = ".\list.txt" ' Таймаут для команды ping, мсек Const PING_TIMEOUT = 90 ' Номер порта для идентификации компа Const PORT_NUM = 135 ' Файл со списокм и лог файл Dim oFSO, oFileList, oLogFile ' Число компов, массив компов и очередное имя компа Dim iCompCount, aFileList, sComp ' Shell и результат выполнения Run Dim WshShell, iShellResult ' Результат нажатия кнопок в MsgBox Dim iBoxResult ' Число компов, которые не пингуются Dim iNoPing ' Очередная строка в лог файле Dim sLine ' Путь к папке профилей пользователей Dim sUserProfilesFolder ' Имя папки "Рабочий стол". Win7+: Desktop, WinXP: Рабочий стол Dim sDesktop ' Объект папка Dim oFolder ' Подпапки Dim oSubFolders ' Текущая папка Dim oCurFolder ' Файл ярлыка Dim sSCFile ' Флаг, если True то на очередном компе в каком-то профиле был найден ярлык, False - в противном случае Dim bSCFound ' Если True, то при удалении ярлыка в одном из профилей произошла ошибка Dim bSCDeleteError ' Строка содержащая имена профилей где произошла ошибка удаления ярлыка Dim sErrProfileList ' Строка содержащая имена профилей где был успешно удален ярлык Dim sSucProfileList On Error Resume Next Set WshShell = WScript.CreateObject("WScript.Shell") Set oFSO = CreateObject("Scripting.FileSystemObject") Err.Clear Set oLogFile = oFSO.OpenTextFile(LOGFILE, 2, True) If Err.Number <> 0 Then ' Ошибка создания лог файла WScript.Echo "Не могу создать лог файл. Видимо нет прав на запись." WScript.Quit(1) End If ' *** ' Список компьютеров задается файлом со списком ' *** If INPUT_DATA = "FILE" Then ' Получение списка компов Err.Clear Set oFileList = oFSO.OpenTextFile(FILELIST, 1) If Err.Number <> 0 Then ' Ошибка открытия файла со списком компов WScript.Echo "Файл со списокм компов " & FILELIST & " - не найден! Файл должен существовать и в каждой строке должен быть IP адрес или имя компа!" WScript.Quit(1) End If ' Получаем массив строк из файла aFileList = split(oFileList.ReadAll, VbCrLF, -1, 1) oFileList.close ' Подсчет количества компов iCompCount = 0 For Each sComp in aFileList sComp = trim(sComp) If Len(sComp)<>0 Then iCompCount = iCompCount + 1 End If Next If iCompCount = 0 Then ' Если компов в списке нет то ничего не делаем WScript.Echo "Компов в списке " & FILELIST & " нет" WScript.Quit(1) End If iBoxResult = MsgBox ("Найдено компов: " & iCompCount & ". Запустить удаление ярлыка?", vbYesNo, "Удаление ярлыка") If iBoxResult=7 Then WScript.Quit(0) End If End If ' *** ' Список компьютеров формируется пингом ' *** If INPUT_DATA = "PING" Then ' Добавлю потом End If iNoPing = 0 ' кол-во компов, которые не пингуются ' Удаление For Each sComp in aFileList sComp = trim(sComp) sLine = "init" If Len(sComp)<>0 Then ' Пинг iShellResult = WshShell.Run ("ping " & sComp & " -n 1 -w " & PING_TIMEOUT, 0, True) If iShellResult=0 Then WScript.StdOut.Write sComp & vbTab ' Определение комп или другая железка (например принтер) iShellResult = WshShell.Run (".\port_test.exe " & sComp & " " & PORT_NUM, 0, True) If iShellResult=0 Then ' Это комп WScript.StdOut.Write "компьютер" & vbTab ' Определение версии ОС If oFSO.FolderExists ("\\" & sComp & "\c$\Users\Public\Desktop") Then ' Windows 7+ sUserProfilesFolder = "\\" & sComp & "\c$\Users" sDesktop = "Desktop" WScript.Echo "Windows 7+" ElseIf oFSO.FolderExists ("\\" & sComp & "\c$\Documents and Settings\All Users\Рабочий стол") Then ' Windows XP sUserProfilesFolder = "\\" & sComp & "\c$\Documents and Settings" sDesktop = "Рабочий стол" WScript.Echo "Windows XP" Else ' Ошибка определения версии ОС sLine = "Ошибка определения версии ОС" sUserProfilesFolder = "Err!" WScript.Echo "ошибка определения версии" End If If sUserProfilesFolder<>"Err!" Then ' Удаление ярлыка ' Перебор всех подпапок (профилей) в каталоге профилей Set oFolder = oFSO.GetFolder (sUserProfilesFolder) Set oSubFolders = oFolder.SubFolders bSCFound = False bSCDeleteError = False sErrProfileList = "" sSucProfileList = "" For Each oCurFolder in oSubFolders sSCFile = sUserProfilesFolder & "\" & oCurFolder.Name & "\" & sDesktop & "\" & FILTER_SC_NAME If oFSO.FileExists (sSCFile) Then ' В текущем профиле на очередном компе найден искомый ярлык bSCFound = True ' Определение режима If READ_ONLY Then ' Эмулируем ошибку Err.Number = 1 Else ' Пытаемся удалить Err.Clear oFSO.DeleteFile sSCFile, True End If If Err.Number<>0 Then ' Ошибка удаления bSCDeleteError = True ' Запоминаем имя профиля sErrProfileList = sErrProfileList & oCurFolder.Name & "; " Else ' Успешное удаление в очередном профиле ' Запоминаем имя профиля sSucProfileList = sSucProfileList & oCurFolder.Name & "; " End If End If Next If bSCFound Then If bSCDeleteError Then sLine = "В одном из профилей произошла ошибка удаления ярлыка: " & sErrProfileList Else sLine = "Ярлык был удален в профилях: " & sSucProfileList End If Else sLine = "Ярлык не был найден" End If End If Else ' Это не комп или порт закрыт WScript.Echo PORT_NUM & "/tcp закрыт" sLine = "Пингуется, но порт " & PORT_NUM & "/tcp закрыт" End If Else iNoPing = iNoPing + 1 sLine = "Не пингуется" End If ' End if iShellResult=0 oLogFile.WriteLine sComp & vbTab & sLine End If ' End If Len(sComp)<>0 Next oLogFile.Close WScript.Echo "Удаление ярлыков завершено"