从自身以管理员身份运行 vbscript (Nagios / NSclient)
Posted
技术标签:
【中文标题】从自身以管理员身份运行 vbscript (Nagios / NSclient)【英文标题】:Run a vbscript as an admin from itself (Nagios / NSclient) 【发布时间】:2014-04-11 09:31:16 【问题描述】:我会尽可能详细地说明,以便您了解我在哪个环境中工作以及我正在尝试做什么。
我在工作中使用 Nagios 来监控我们的服务器。我们的每台 Windows 服务器都安装了 NSclient++。 Nagios 调用的众多脚本之一是 check_updates.vbs;如果有人需要知道,情况如下:
在 Nagios 的服务器端,我们执行以下命令:
/usr/lib/nagios/plugins/check_nrpe -H WindowsServerIpAddress -p 5666 -t 120 -c check_updates
当我们执行该命令时,Windows Server 上会发生以下情况:
通过使用 nscp 服务,它调用在 nsclient.ini 文件(到 NSclient++ 文件夹中)中定义的以下命令:
check_updates=cscript.exe //T:120 //NoLogo scripts\\check_updates.vbs
然后,它调用check_updates.vbs script。
Windows 服务器上的本地帐户是管理员帐户。我们更改了 nscp 服务的属性,以便使用另一个帐户调用此服务,该帐户专门用于监控。
因此,当我们直接在 Windows 服务器(即本地)上调用 check_updates.vbs 脚本时,一切顺利,脚本运行良好。但是,如果我们在 Nagios 服务器上远程调用它,我们会遇到一个简单(但致命的)错误,即 Permission denied。
这就是为什么我们专注于为监控用户提供足够的权限。
在进行了越来越多的搜索并尝试了我们所能做的一切之后,我必须说我们现在有点迷路了。
我尝试的最后一个解决方案是在脚本的开头添加这些行,以给予监控用户足够的权限来正确执行脚本:
Set WshShell = WScript.CreateObject("WScript.Shell")
If WScript.Arguments.length = 0 Then
Set ObjShell = CreateObject("Shell.Application")
ObjShell.ShellExecute "wscript.exe", """" & _
WScript.ScriptFullName & """" &_
" RunAsAdministrator", , "runas", 1
End if
(我发现了这个here)
当我使用它时,我会在本地收到 [错误通知*],但脚本仍然可以运行。但是,当我远程调用脚本时,我只是在 120 秒后超时。
更多信息:UAC 在 Windows 服务器上被禁用,监控用户对 NSclient++\scripts 文件夹具有完全访问控制权。使用管理员帐户使用 nscp 服务不是我们正在寻求的解决方案。
那么,我在这里遗漏了什么吗?你对此有什么想法吗?
感谢您的帮助! :)
[*错误提示]:参数无效,用 cscript.exe check_available_updates.vbs -h 查看帮助
【问题讨论】:
【参考方案1】:如果 UAC 关闭,则不是 UAC 权限错误,因此不必担心 runas。
这也不太可能是文件权限问题(所有管理员都是平等的,除非有人改变了它)。
很可能是不同的环境。您有一个仅适用于交互式用户的假设。您需要记录脚本中发生的事情(请参阅 wshshell.LogEvent(intType, strMessage [,strTarget]))。如果你的脚本有
on error remove next
删除它。
映射驱动器是个问题。环境变量和特殊文件夹也是如此。
尝试使用带有各种选项(例如 /env)的 Runas 命令行命令,看看是否可以复制该行为。
也运行
cmd /c set > c:\set.log
并比较两种运行方式的输出(即与您的客户端和直接)。
【讨论】:
【参考方案2】:感谢您的回答 Tony,我已经尝试了您的建议,但最终我们解决了这个问题。
尽管我们为监控用户提供了执行此脚本所需的所有权限,但它仍无法正常工作。所以这就是我们所做的:
我们创建了一个 bat 文件,其中包含用于调用 check_update.vbs 并将其输出写入新文件的命令行:
cscript.exe //T:120 //NoLogo "C:\Program Files\NSClient++\scripts\check_updates.vbs" > "C:\Program Files\NSClient++\check_update.log"
然后,我们创建了一个计划任务(使用 TaskScheduler),它每天调用 bat 文件来检查新的更新。
为了在 Nagios 中获得正确的输出,我们创建了另一个 vbscript,它只需要读取 check_update.log 文件并将适当的值返回给 Nagios:
Const ForReading = 1
Const rOK = 0
Const rWarning = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Program Files\NSClient++\check_update.log", ForReading)
FirstChar = objFile.Read(1)
Content = objFile.ReadAll
If FirstChar = "O" Then
Wscript.Echo FirstChar + Content
Wscript.Quit(rOK)
Else
WScript.Echo FirstChar + Content
End If
Wscript.Quit(rWarning)
这个 vbscript 真的是基本的,因为它只读取文件的第一个字母来决定返回哪个值。事实上,如果没有可用的更新,消息将始终是“OK - No patch missing”。
因此,通过使用 SchedulerTask 调用 bat 文件,我们解决了监控用户没有足够权限执行脚本的事实。
【讨论】:
以上是关于从自身以管理员身份运行 vbscript (Nagios / NSclient)的主要内容,如果未能解决你的问题,请参考以下文章