Показать полную графическую версию : [решено] Удаление файла с рабочих столов по сети
Roman_Ko
22-03-2017, 11:10
Доброго времени суток! Помогите с решением задачки.
Необходимо удалить файл (например, file.exe) с рабочих столов всех пользователей в сети домена.
Условия - профили пользователей могут находиться как на диске С так и на D и т.д. Для выполнения задачи необходимо применять psexec
Накатал примерный батник (выполняется из под админа в домене)
@echo off
set listfile=computername.txt
rem computername.txt содержит имена компьютеров, например, pc-01, pc-02 и т.д.
for /f "tokens=1" %%i in (%listfile%) do (
@start cmd /c psexec.exe \\%%i cmd /c del /q/f/a/s "C:\Users\file.exe"
exit /b
)
exit /b
Но данный вариант работает, если профиль пользователя находится в конкретном заданном месте, например, в c:\users.
Пробую вариант с объявлением переменной %%a (`dir /B "%HomeDrive%\Users"`)
@echo off
set listfile=computername.txt
for /f "tokens=1" %%i in (%listfile%) do (
cmd /v /c for /f "usebackq" %%a in (`dir /B %HomeDrive%\Users`^) do
@start cmd /c psexec.exe \\%%i cmd /c del /q/f/a/s %HomeDrive%\Users\%%a\desktop\file.exe
exit /b
)
exit /b
Но где то беда с синтаксисом - переменная %%a не объявляется...
Roman_Ko,
через логон скрипт не хочешь решить эту проблему?
там %userprofile% корректно покажет где надо удалять. ну или хотябы насобираешь пути профелей, а потом пройдешься по ним своим скриптом?
Roman_Ko
22-03-2017, 13:35
через логон скрипт не хочешь решить эту проблему? »
Да это собственно говоря и не проблема, это задача, и именно с применением psexec.
А так - да, можно, например так
On Error Resume Next
Set WshShell = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
sUserDir = WshShell.ExpandEnvironmentStrings("%USERPROFILE%")
file = "\desktop\file.exe"
FSO.DeleteFile (sUserDir) & (file), True
А так - да, можно, например так »
Roman_Ko, так, да не так. Не On Error Resume Next, не ExpandEnvironmentStrings("%USERPROFILE%") и не "\desktop\…", а либо тот же WshShell, либо Shell:
WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders("Desktop")
WScript.Echo WScript.CreateObject("Shell.Application").NameSpace("shell:Desktop").self.Path
Roman_Ko
22-03-2017, 14:56
Всё отлично, хорошо, спасибо, я ценю Вашу помощь. Но уважаемые форумчане, Вы пытаетесь помочь решить задачу немного не тем способом, которым было запланировано решить задачу изначально.
Давайте отмотаем немного назад :)
Подскажите где синтаксическая ошибка в батнике?
@echo off
set listfile=computername.txt
for /f "tokens=1" %%i in (%listfile%) do (
cmd /v /c for /f "usebackq" %%a in (`dir /B %HomeDrive%\Users`^) do
@start cmd /c psexec.exe \\%%i cmd /c del /q/f/a/s %HomeDrive%\Users\%%a\desktop\file.exe
exit /b
)
exit /b
Ошибка не в «батнике», а в том, что Ваш psexec.exe выполняется не в контексте пользователя, сидящего за удалённой машиной. И — ничего, что %HomeDrive% берётся с той машины, где исполняется пакетный файл, а? Ничего, что на удалённой машине вообще может быть не Vista+? Какой смысл в переборе каталога Users на локальной машине? В общем, у Вас тут сборная непонятная солянка.
Чем Вам так не нравится тот же logon-скрипт?
Roman_Ko
22-03-2017, 16:24
Чем Вам так не нравится тот же logon-скрипт? »
Ничего против не имею.
Задача решается разными способами. Но в данном случае интересен вариант через psexec. Интересен потому, что если его "допилить", то удаление нужного файла из нужного места на удаленной машине (машина на win, домен) возможно по одному вашему клику, т.е. оперативное удаление.
Какой смысл в переборе каталога Users на локальной машине? »
смысл - выявить все локальные профили на удаленном ПК. Зачем это нужно? - Т.к. неизвестно под каким профилем работает на данный момент пользователь.
Но, выявив все локальные профили, можно выполнить команду на удаление в каждом профиле интересующего нас файла, если таков найдется конечно.
Ваш psexec.exe выполняется не в контексте пользователя, сидящего за удалённой машиной. И — ничего, что %HomeDrive% берётся с той машины, где исполняется пакетный файл, а? »
Вот, первый комментарий по делу, спасибо. А ведь действительно, Вы правы. Буду думать.
то удаление нужного файла из нужного места на удаленной машине (машина на win, домен) возможно по одному вашему клику, т.е. оперативное удаление. »
Или не доступно — например, в данный момент машина выключена. Логон-скрипт же гарантированно выполнится, когда бы машина не была включена.
смысл - выявить все локальные профили на удаленном ПК. »
Вот только в коде Вы выявляете все каталоги в %HomeDrive%\Users на локальной машине, а не на удалённой. Про что и речь.
Исходя из заявленного Вами:
Но, выявив все локальные профили, можно выполнить команду на удаление в каждом профиле интересующего нас файла, если таков найдется конечно. »
psexec.exe \\%%i cmd.exe /c del /a /s /f /q c:\Users\file.exe
— не надо искать и перебирать профили. Просто удаляйте. Особенно c .exe.
Roman_Ko
22-03-2017, 16:53
Вот только в коде Вы выявляете все каталоги в %HomeDrive%\Users на локальной машине, а не на удалённой. Про что и речь. »
Да да, это я уже понял из предыдущего Вашего сообщения. Спасибо
psexec.exe \\%%i cmd.exe /c del /a /s /f /q c:\Users\file.exe
— не надо искать и перебирать профили. Просто удаляйте. Особенно c .exe. »
А если профиль в другом месте? например, на диске D? Поэтому и допиливаю вариант с перебором профилей.
Roman_Ko
22-03-2017, 18:03
Вопрос решён благодаря наводящим вопросам от Iska
Вот рабочий вариант
@echo off
set listfile=computername.txt
for /f "tokens=1" %%i in (%listfile%) do (
@start cmd /c "psexec.exe \\%%i cmd /c "for /f "tokens=1" ^%%a in ('dir /B "%HomeDrive%\Users"'^) do^
del /q/f/a/s "%HomeDrive%\Users\%%a\desktop\file.exe""
exit /b
)
exit /b
Ещё раз спасибо.
Roman_Ko, потому и логон-скрипт, что там ничего допиливать не нужно. А в этом случае как? Нужно:
разрешить отложенное исполнение переменных окружения;
запросить раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList и разобрать полученное в цикле;
для каждого полученного пути загрузить куст и посмотреть на параметр Desktop аналога HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders загруженного куста;
не забыть выгрузить куст.
Плюс ко всему, не забываем, что за машиной кто-то уже сидит, и его куст уже подгружен в HKU — и это надо учесть.
И это — минимум. Теоретически это можно уместить в одну очень длинную строку, но заморитесь играться с кавычками, операторными скобками и прочей радостью пакетных файлов. И всё это вместо банального:
Option Explicit
Dim strFileName
Dim strFullFileName
strFileName = "file.exe"
With WScript.CreateObject("Scripting.FileSystemObject")
strFullFileName = .BuildPath(WScript.CreateObject("WScript.Shell").SpecialFolders("Desktop"), strFileName)
If .FileExists(strFullFileName) Then
.DeleteFile strFullFileName, True
End If
End With
WScript.Quit 0
Вопрос решён благодаря наводящим вопросам от Iska
Вот рабочий вариант »
Не решён. Профили могут быть расположены не в %HomeDrive%, не в Users, вообще на разных разделах, папка Рабочего стола именоваться не Desktop, может лежать вовне папки профиля пользователя.
Roman_Ko
23-03-2017, 09:15
И вновь Вы оказались правы, я действительно не учел многих важных вещей.
Приятно с Вами общаться. Спасибо.
Задача решается разными способами. Но в данном случае интересен вариант через psexec. »
так это я ж сразу написал:
логон скриптом накапливаете текстовый файл, где каждая строка путь к этому несчастному файлу на рабочем столе.
а потом вашим любимым psexec по этому списку шарахатете удаление. Или наоборот )))
А в for /f "tokens=1" ^%%a in ('dir /B "%HomeDrive%\Users"'^) »
добавил бы на всякий пожарный delims=*
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.