
Некоторое время назад я разместил вопрос с просьбой написать скрипт 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
решение1
Если вы хотите обойти проблему перенаправленного рабочего стола и проблему с разрешениями, создаваемую соединением «Все пользователи», вы можете жестко закодировать каталог поиска и пропустить все пути поиска, включающие «Все пользователи». Пример (два изменения отмечены комментариями):
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
возникнет ошибка «Доступ запрещен».