VB スクリプトの問題

VB スクリプトの問題

しばらく前に、ショートカット「TeamViewer 12 Host」を、もし存在するなら、誰のデスクトップからでも削除する VB スクリプトを求める質問を投稿しました。リモートではなくローカルです。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

リダイレクトされたデスクトップの問題と、「すべてのユーザー」ジャンクションによって作成されたアクセス許可の問題をスキップしたい場合は、検索ディレクトリをハードコードし、「すべてのユーザー」を含む検索パスをスキップすることができます。例 (2 つの変更はコメントでマークされています):

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「アクセスが拒否されました」というメッセージが表示されます。

関連情報