Лог Пафа – Скрипт удаления ярлыка во всех профилях пользователей по списку компьютеров


Скрипт удаления ярлыка во всех профилях пользователей по списку компьютеров

Скрипт удаляет ярлык (или любой другой файл) с рабочего стола. При этом, поиск происходит во всех профилях пользователей.

Для 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$, поэтому, необходимо быть администратором на целевых компах.

Перед входом на комп через админскую шару, скрипт пингует комп. Если комп не пингуется, то скрипт не полезет на комп.

Таким образом, для запуска удаления ярлыка нужно:

  1. Задать имя удаляемого ярлыка в константе FILTER_SC_NAME
  2. Задать список целевых компов в файле 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 "Удаление ярлыков завершено"

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

Do NOT follow this link or you will be banned from the site! как раскрутить сайт