【问题标题】:VBScript Error "Permission Denied" But Works AnywayVBScript 错误“权限被拒绝”但仍然有效
【发布时间】:2017-06-17 02:18:36
【问题描述】:

我的 GPO 中有一个 VBScript 设置作为登录脚本。我遇到了一个问题,每次它在登录时运行,我都会在线获得 Permission Denied:

set lf = fso.opentextfile(lfp, 2, true)

兴趣点:

  • 尽管出现错误,脚本仍成功完成。
  • 如果我手动运行脚本,脚本执行不会出错。
  • lfp 变量指向 c:\folder\folder\file.log。文件被创建(必要时)并被适当地填充(被覆盖,当它确实存在时,正如预期的那样)。
  • 如果创建了文件,则在尝试打开文本文件之前关闭 fso。
  • 通过继承的 Authenticated Users 权限(来自 c:\folder1 - 见下文),登录的用户确实对路径和被替换的文件具有修改权限。
  • 如果我在该行之前输入 wscript.sleep 30000,它只会等待 30 秒以抛出权限被拒绝。
  • 如果用户是 PC 上本地管理员组的成员,我不会收到任何错误。同样,当用户不是本地管理员时,它会出错,但会成功完成。
  • 我在 Windows 7 和 10 下都看到了相同的行为。

我在这里不知所措。这是代码的相关部分(请原谅任何糟糕的编码习惯):

'notify robocopy log file location
function seelog(log)
  lf.writeline "[" & now & "]  " & "See log file for details: " & log
end function

'process robocopy exit codes and write log
function writeerrors(items)
  docs = items(0)
  retcode = items(1)
  logfile = items(2)
  if docs = "c" then
    name = "some stuff"
  else
    name = "some other stuff"
  end if
  If retcode = 0 Then
    lf.writeline "[" & now & "]  " & name & " folder was already up to date."
  elseif retcode = 1 then
    lf.writeline "[" & now & "]  " & name & " folder was updated."
    seelog(logfile)
  else
    lf.writeline "[" & now & "]  " & name & " folder update exited with robocopy error code: " & retcode
    seelog(logfile)
  End If
end function

'get logged in user
un = CreateObject("WScript.Network").UserName

'check for logfile, and if not exist, create
'folder1 always exists, no need to check or create
lfp = "c:\folder1\folder2\folder3\logfile1.log"
ld1 = "c:\folder1\folder2"
ld2 = "c:\folder1\folder2\folder3"

set fso = createobject("scripting.filesystemobject")

if not fso.fileexists(lfp) then
  if not fso.folderexists(ld1) then
    fso.createfolder(ld1)
  end if
  if not fso.folderexists(ld2) then
    fso.createfolder(ld2)
  end if
  set cf = fso.createtextfile(lfp)
  cf.close
end if

'open logfile (lfp variable)
'for writing (2)
'overwrite if already exists (true)
wscript.sleep 30000
'************permission denied happens on next line on lfp var*************
Set lf = fso.OpenTextFile(lfp, 2, True)

lf.writeline "[" & now & "]  " & "Script started."
lf.writeline "[" & now & "]  " & "Logged in user: " & un
lf.writeline "[" & now & "]  " & "========================================================="

more code writing to log file and executing robocopy....

我认为抑制所有错误是一种选择,但 1) 我宁愿不这样做,并且 2) 我不清楚如何在 VBScript 中实现这一点。

预计到达时间:

On Error Resume Next
  Set lf = fso.OpenTextFile(lfp, 2, True)
On Error Goto 0

我对此进行了测试,它确实破坏了脚本。由于错误未设置 lf,因此以下行错误,如预期的 'object required "lf"' code 800a01a8。

【问题讨论】:

    标签: vbscript windows-7 windows-10 permission-denied robocopy


    【解决方案1】:

    On Error Resume Next 将忽略该错误,然后On Error Goto 0 将重新打开正常的错误处理

    【讨论】:

    • 请看我的预计到达时间。如果我做错了,请告诉我。
    【解决方案2】:

    我不喜欢这样做,但我的工作是从 .bat 启动 .vbs(个人偏好 - 我喜欢将所有内容从一份工作中保存在一个脚本中,因此将来我不必去寻找文件)。

    我在 GPO 中放置了一个 logon.bat 文件作为登录脚本。

    @echo off
    echo Launching update script...
    
    cscript c:\folder1\script.vbs
    

    这似乎可以解决我遇到的(显然是错误的)权限问题。我仍然很好奇是否有人能确切地告诉我为什么我会看到我看到的行为。当调用只有管理员用户可以访问的 OpenTextFile(直接从 GPO 启动时)时,脚本引擎是否可能写入临时位置?

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2018-07-19
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多