Проблемы с VB Script

260
ZiggyStardust

Некоторое время назад я опубликовал вопрос с просьбой о сценарии VB для удаления ярлыка «TeamViewer 12 Host» с любого компьютера и с любого рабочего стола, если он существует. Местный не удаленный. Я запустил его на своей рабочей станции Windows 10, и он работал. Это даже компенсировало перенаправление моего рабочего стола на сервер. Проблема в том, что я не могу заставить его работать на чужом компьютере. На всех остальных, даже если они являются локальными администраторами, они получают ошибку «Отказано в доступе», когда он пытается удалить ее. Они тоже местные администраторы. Я даже пытался запустить его из командной строки с повышенными правами. Нет радости Странно то, что я могу перейти к нему через проводник и удалить его без проблем. Только думаю, что я могу думать, что это что-то в сценарии. Есть идеи, что происходит?

 ' Specify filename to remove from user desktops strShortcut = "TeamViewer 12 Host.lnk"  ' Create file system object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell")  ' Find root of user data folder (C:\USERS on recent versions of Windows) strUsers = objFSO.GetParentFolderName(objFSO.GetParentFolderName(objShell.SpecialFolders("Desktop"))) Set objUsers = objFSO.GetFolder(strUsers)  ' Check each user folder, and look for our file in the DESKTOP subfolder For Each objFolder In objUsers.SubFolders strCheck = objFolder & "\Desktop\" & strShortcut Wscript.Echo "Checking:" & strCheck ' If shortcut file exists remove it If objFSO.FileExists(strCheck) Then Wscript.Echo "Deleting:" & strCheck objFSO.DeleteFile(strCheck) End If Next 
0
Помогает ли добавить `on error resume next` в начало скрипта? HelpingHand 7 лет назад 0

1 ответ на вопрос

0
Tanner Jotblad

Если вы хотите пропустить проблему перенаправленного рабочего стола и проблему разрешений, созданную соединением «Все пользователи», вы можете жестко закодировать каталог поиска и пропустить любые пути поиска, которые включают «Все пользователи». Пример (два изменения помечены комментариями):

strShortcut = "TeamViewer 12 Host.lnk"  Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell")  strUsers = "C:\Users" ' <-- or "C:\Documents and Settings" for XP, etc. Set objUsers = objFSO.GetFolder(strUsers)  For Each objFolder In objUsers.SubFolders strCheck = objFolder & "\Desktop\" & strShortcut If InStr(strCheck, "All Users") = 0 Then ' <-- SKIP "All Users" to avoid permission problems Wscript.Echo "Checking:" & strCheck If objFSO.FileExists(strCheck) Then Wscript.Echo "Deleting:" & strCheck objFSO.DeleteFile(strCheck) End If End If Next 

Оригинальный ответ:

Вы упомянули, что ваш рабочий стол перенаправлен в сетевую папку. Если ваши пользователи имеют права доступа к пути к сетевому профилю ( strUsersв этом контексте), они должны получить ошибку «Отказано в доступе», поскольку For Eachцикл пытается удалить файл с перенаправленного рабочего стола другого пользователя.

Пример: удаление \\fileserver\profiles\YourUser\Desktop\TeamViewer 12 Host.lnkбудет в порядке, но удаление \\fileserver\profiles\SomeOtherUser\Desktop\TeamViewer 12 Host.lnkдаст «Отказано в доступе».

Не считается. Мой рабочий стол перенаправлен. Их нет. Это работает на моем. Не работает на их. В связи с этим, даже если бы это было так, ошибка будет «Файл не найден», а не «Доступ запрещен». Попробуйте это на своем локальном компьютере. Поместите ярлык «TeamViewer 12 Host» в папку «User \ Public \ Public Desktop» и попробуйте скрипт. ZiggyStardust 7 лет назад 0
Все наши доменные учетные записи имеют перенаправленные рабочие столы, так что это был мой контекст. Запуск его из учетной записи локального администратора работает для меня, если ярлык отсутствует на рабочем столе Public, и в этом случае он по-прежнему выдает «Отказано в доступе». Для ваших пользователей это ярлык на рабочем столе или на общем рабочем столе? Tanner Jotblad 7 лет назад 0
Ярлык может быть где угодно, но, как правило, он находится в Public \ Desktop. Теперь вы видите проблему. Я могу перейти к этой папке и удалить значок вручную, но скрипт выдает «Доступ запрещен». Это привело бы меня к мысли, что проблема в сценарии. Даже запуск сценария в командной строке с повышенными правами выдает «Отказано в доступе». ZiggyStardust 7 лет назад 0
Я думаю, что проблема в публичном рабочем столе. Поскольку он проверяет папки в алфавитном порядке, он проверяет «All Users» перед «Public», а «All Users» является переходом к «Public» с различными разрешениями. Попробуйте поставить что-то вроде этого перед вашим "Checking:" echo: `If InStr (strCheck," All Users ") <> 0 Тогда Wscript.Echo" Пропуск всех пользователей "Else` Tanner Jotblad 7 лет назад 0
Это сработало, но на самом деле подняло больше вопросов. Во-первых, почему он не может удалить из «Все пользователи»? Локальный админ и побежал в приподнятой подсказке не меньше, чем настоящий вопрос .... Я знаю, почему это сработало на моем сейчас. Он никогда не смотрел на диске C :. Он определил, что мой рабочий стол находится на сервере и никогда не смотрел на C: поэтому он никогда не находил папку «Все пользователи». Я не знаю достаточно о VB, но будет ли работать этот скрипт, даже если пользователь не вошел в систему? ZiggyStardust 7 лет назад 0
Что вы подразумеваете под тем, что пользователь не вошел в систему? Планируете ли вы запустить это один раз для всех существующих пользователей или настроить для запуска при первом входе в систему (например, через групповую политику)? В любом случае, ему нужен некоторый пользовательский контекст для запуска Tanner Jotblad 7 лет назад 0
Что касается того, почему это не работает для «всех пользователей», я предполагаю, что это потому, что разрешения для \ All Users \ Desktop (как соединение) отличаются от разрешений для \ Public \ Desktop. А именно, «Все пользователи» настроены на предоставление полного контроля администраторам, но только на эту папку, тогда как «Общедоступные» настроены на предоставление полного контроля администраторам в этой папке, а также в подпапках и файлах. Tanner Jotblad 7 лет назад 0
Он будет частью пакета RMM, поэтому он будет работать независимо от того, вошел ли пользователь в систему или нет. Я не уверен, что петля верна. Я думаю, что цикл будет для каждого профиля ..... проверьте значок на рабочем столе. Я смотрел петлю на моем компьютере. Он пошел прямо на сервер и никогда не смотрел на C :. Вот почему это сработало на моем. Если никогда не смотрел в C: \ All Users или где-либо на C :. Отсюда вопрос о пользовательском контексте. Похоже, он нашел мой профиль, а затем предположил, что все остальные были в том же месте. Не тот случай. ZiggyStardust 7 лет назад 0
Цикл подходит для локальных пользователей (если он пропускает всех пользователей). Это просто не работает для вас, потому что ваш рабочий стол находится в другом контексте (см. Пример в моем ответе). Какой пользователь будет запускать скрипт для вашего пакета? Tanner Jotblad 7 лет назад 0
Я говорю ваш комментарий, но я думаю, что вы пропустили то, что я имел в виду. Вы правы, потому что он работал на моем, потому что он не смотрел на папку «Все пользователи», и это проблема и благо. Благо в том, что папка «Все пользователи» является проблемным дочерним элементом и не может удалить из нее, но весь сценарий бесполезен, потому что он не просматривает все профили. ZiggyStardust 7 лет назад 0
В моем случае это выглядело и мой рабочий стол, который находится на сервере (перенаправленный). Он нашел мой рабочий стол, а затем остался на сервере в поисках других. Он полностью пропустил профили на диске C: и да, было 5 или 6 на диске C :. Перенаправление папок может быть выполнено для каждого пользователя, когда мой Рабочий стол находится на сервере, но другие 5 пользователей этого компьютера не перенаправляют свои рабочие столы, поэтому их рабочий стол находится на диске C :. Он даже не смотрел на них. Он посмотрел на контекст текущего пользователя (мой), а затем остался на сервере в поисках другого. Он никогда не смотрел на диске C :. ZiggyStardust 7 лет назад 0
Вот почему я считаю, что управление внешним видом некорректно. Он должен пройти через каждый профиль, определить, где находится рабочий стол для этого профиля. Затем проверьте его на значок. ZiggyStardust 7 лет назад 0
Но будет хорошо, если он будет работать в контексте локального пользователя, и вы включите логику, чтобы пропустить «Все пользователи», поэтому я спросил, для какого пользователя будет запускаться скрипт. Если это вы, то да, это не будет работать так, как есть, и в таком случае вы не могли бы просто жестко закодировать C: \ Users как root, если вы знаете, что это будет для них? Если это локальный администратор, то он должен работать нормально, так как все равно будет смотреть на C: \. Tanner Jotblad 7 лет назад 0
Нет никакого способа узнать, какой пользователь войдет в систему, если таковой имеется, при запуске сценария. Я согласен, что он должен быть жестко запрограммирован, чтобы искать и перебирать C: \ Users и находить где каждый рабочий стол пользователя, если оттуда (и пропустить All Users). Он не может быть основан на том, что какой-либо пользователь вошел в систему при запуске. Вы знаете, как внести изменения? ZiggyStardust 7 лет назад 0
Независимо от этого, он должен запустить _as_ некоторый пользователь; это не может работать как ничто. Это, вероятно, указывается, где бы вы ни настраивали скрипт. Я обновил свой ответ с изменениями. Tanner Jotblad 7 лет назад 0
Он запускается как «Система». Я изменил «Рабочий стол» на «Профили», и он начал просматривать папку с профилями на диске C: Я надеялся, что когда он попадет в мой профиль, он узнает, что мой рабочий стол был перенаправлен на сервер, а это не так. Это стало немного сложным для моей крови. Спасибо за помощь. ZiggyStardust 7 лет назад 0

Похожие вопросы