Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление файла с рабочих столов по сети (http://forum.oszone.net/showthread.php?t=325121)

Roman_Ko 22-03-2017 11:10 2721994

Удаление файла с рабочих столов по сети
 
Доброго времени суток! Помогите с решением задачки.
Необходимо удалить файл (например, 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 не объявляется...

Опиум 22-03-2017 12:15 2722011

Roman_Ko,

через логон скрипт не хочешь решить эту проблему?
там %userprofile% корректно покажет где надо удалять. ну или хотябы насобираешь пути профелей, а потом пройдешься по ним своим скриптом?

Roman_Ko 22-03-2017 13:35 2722035

Цитата:

Цитата Опиум
через логон скрипт не хочешь решить эту проблему? »

Да это собственно говоря и не проблема, это задача, и именно с применением 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


Iska 22-03-2017 14:34 2722059

Цитата:

Цитата Roman_Ko
А так - да, можно, например так »

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 2722066

Всё отлично, хорошо, спасибо, я ценю Вашу помощь. Но уважаемые форумчане, Вы пытаетесь помочь решить задачу немного не тем способом, которым было запланировано решить задачу изначально.
Давайте отмотаем немного назад :)
Подскажите где синтаксическая ошибка в батнике?
Код:

@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


Iska 22-03-2017 15:59 2722101

Ошибка не в «батнике», а в том, что Ваш psexec.exe выполняется не в контексте пользователя, сидящего за удалённой машиной. И — ничего, что %HomeDrive% берётся с той машины, где исполняется пакетный файл, а? Ничего, что на удалённой машине вообще может быть не Vista+? Какой смысл в переборе каталога Users на локальной машине? В общем, у Вас тут сборная непонятная солянка.

Чем Вам так не нравится тот же logon-скрипт?

Roman_Ko 22-03-2017 16:24 2722114

Цитата:

Цитата Iska
Чем Вам так не нравится тот же logon-скрипт? »

Ничего против не имею.
Задача решается разными способами. Но в данном случае интересен вариант через psexec. Интересен потому, что если его "допилить", то удаление нужного файла из нужного места на удаленной машине (машина на win, домен) возможно по одному вашему клику, т.е. оперативное удаление.
Цитата:

Цитата Iska
Какой смысл в переборе каталога Users на локальной машине? »

смысл - выявить все локальные профили на удаленном ПК. Зачем это нужно? - Т.к. неизвестно под каким профилем работает на данный момент пользователь.
Но, выявив все локальные профили, можно выполнить команду на удаление в каждом профиле интересующего нас файла, если таков найдется конечно.
Цитата:

Цитата Iska
Ваш psexec.exe выполняется не в контексте пользователя, сидящего за удалённой машиной. И — ничего, что %HomeDrive% берётся с той машины, где исполняется пакетный файл, а? »

Вот, первый комментарий по делу, спасибо. А ведь действительно, Вы правы. Буду думать.

Iska 22-03-2017 16:38 2722119

Цитата:

Цитата Roman_Ko
то удаление нужного файла из нужного места на удаленной машине (машина на win, домен) возможно по одному вашему клику, т.е. оперативное удаление. »

Или не доступно — например, в данный момент машина выключена. Логон-скрипт же гарантированно выполнится, когда бы машина не была включена.

Цитата:

Цитата Roman_Ko
смысл - выявить все локальные профили на удаленном ПК. »

Вот только в коде Вы выявляете все каталоги в %HomeDrive%\Users на локальной машине, а не на удалённой. Про что и речь.

Исходя из заявленного Вами:
Цитата:

Цитата Roman_Ko
Но, выявив все локальные профили, можно выполнить команду на удаление в каждом профиле интересующего нас файла, если таков найдется конечно. »

Код:

psexec.exe \\%%i cmd.exe /c del /a /s /f /q c:\Users\file.exe
— не надо искать и перебирать профили. Просто удаляйте. Особенно c .exe.

Roman_Ko 22-03-2017 16:53 2722124

Цитата:

Цитата Iska
Вот только в коде Вы выявляете все каталоги в %HomeDrive%\Users на локальной машине, а не на удалённой. Про что и речь. »

Да да, это я уже понял из предыдущего Вашего сообщения. Спасибо
Цитата:

Цитата Iska
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 2722141

Вопрос решён благодаря наводящим вопросам от 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

Ещё раз спасибо.

Iska 22-03-2017 18:16 2722148

Roman_Ko, потому и логон-скрипт, что там ничего допиливать не нужно. А в этом случае как? Нужно:
  1. разрешить отложенное исполнение переменных окружения;
  2. запросить раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList и разобрать полученное в цикле;
  3. для каждого полученного пути загрузить куст и посмотреть на параметр Desktop аналога HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders загруженного куста;
  4. не забыть выгрузить куст.
Плюс ко всему, не забываем, что за машиной кто-то уже сидит, и его куст уже подгружен в 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

Цитата:

Цитата Roman_Ko
Вопрос решён благодаря наводящим вопросам от Iska
Вот рабочий вариант »

Не решён. Профили могут быть расположены не в %HomeDrive%, не в Users, вообще на разных разделах, папка Рабочего стола именоваться не Desktop, может лежать вовне папки профиля пользователя.

Roman_Ko 23-03-2017 09:15 2722323

И вновь Вы оказались правы, я действительно не учел многих важных вещей.
Приятно с Вами общаться. Спасибо.

Опиум 23-03-2017 13:03 2722382

Цитата:

Цитата Roman_Ko
Задача решается разными способами. Но в данном случае интересен вариант через psexec. »

так это я ж сразу написал:

логон скриптом накапливаете текстовый файл, где каждая строка путь к этому несчастному файлу на рабочем столе.
а потом вашим любимым psexec по этому списку шарахатете удаление. Или наоборот )))

А в
Цитата:

Цитата Roman_Ko
for /f "tokens=1" ^%%a in ('dir /B "%HomeDrive%\Users"'^) »

добавил бы на всякий пожарный delims=*


Время: 12:00.

Время: 12:00.
© OSzone.net 2001-