VBScript 错误 "Permission Denied" 但仍然有效
VBScript Error "Permission Denied" But Works Anyway
我的 GPO 中有一个 VBScript 设置作为登录脚本。我遇到了一个问题,每次登录时 运行s,我都会在该行收到 Permission Denied:
set lf = fso.opentextfile(lfp, 2, true)
兴趣点:
- 尽管有错误,脚本仍成功完成。
- 如果我手动 运行 脚本执行没有错误。
- lfp 变量指向 c:\folder\folder\file.log。该文件被创建(必要时)并适当地填充(覆盖,当它确实存在时正如预期的那样)。
- 如果文件已创建,则在尝试打开文本文件之前关闭 fso。
- 登录的用户通过继承的已验证用户权限(来自 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"' 代码 800a01a8 错误。
On Error Resume Next
将忽略错误然后 On Error Goto 0
将重新打开正常的错误处理
我不喜欢这样做,但我的解决方法是从 .bat 启动 .vbs(个人偏好 - 我喜欢将一项工作的所有内容都放在一个脚本中,所以将来我不会必须四处寻找文件)。
我在我的 GPO 中放置了一个 logon.bat 文件作为登录脚本。
@echo off
echo Launching update script...
cscript c:\folder1\script.vbs
这似乎解决了我遇到的(显然是错误的)权限问题。我仍然很好奇是否有人能确切地告诉我为什么我会看到我看到的行为。在调用 OpenTextFile(直接从 GPO 启动时)时,脚本引擎是否可能写入只有管理员用户才能访问的临时位置?
我的 GPO 中有一个 VBScript 设置作为登录脚本。我遇到了一个问题,每次登录时 运行s,我都会在该行收到 Permission Denied:
set lf = fso.opentextfile(lfp, 2, true)
兴趣点:
- 尽管有错误,脚本仍成功完成。
- 如果我手动 运行 脚本执行没有错误。
- lfp 变量指向 c:\folder\folder\file.log。该文件被创建(必要时)并适当地填充(覆盖,当它确实存在时正如预期的那样)。
- 如果文件已创建,则在尝试打开文本文件之前关闭 fso。
- 登录的用户通过继承的已验证用户权限(来自 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"' 代码 800a01a8 错误。
On Error Resume Next
将忽略错误然后 On Error Goto 0
将重新打开正常的错误处理
我不喜欢这样做,但我的解决方法是从 .bat 启动 .vbs(个人偏好 - 我喜欢将一项工作的所有内容都放在一个脚本中,所以将来我不会必须四处寻找文件)。
我在我的 GPO 中放置了一个 logon.bat 文件作为登录脚本。
@echo off
echo Launching update script...
cscript c:\folder1\script.vbs
这似乎解决了我遇到的(显然是错误的)权限问题。我仍然很好奇是否有人能确切地告诉我为什么我会看到我看到的行为。在调用 OpenTextFile(直接从 GPO 启动时)时,脚本引擎是否可能写入只有管理员用户才能访问的临时位置?