我会尽可能详细地了解您,以便了解我正在处理的环境以及我想要做的事情。
我正在使用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 Server上的本地帐户是管理员帐户。我们更改了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秒后超时。
更多信息:Windows服务器上禁用了UAC,监控用户对NSclient ++ \ scripts文件夹具有完全访问控制权限。将nscp服务与admin帐户一起使用并不是我们正在寻求的解决方案。
那么,我在这里错过了什么吗?你对此有什么想法吗?
感谢您的帮助! :)
[*错误通知]:参数无效,请查看cscript.exe的帮助check_available_updates.vbs -h
答案 0 :(得分:0)
如果UAC关闭则不是UAC权限错误,因此不要担心runas。
它也不太可能是文件权限问题(所有管理员都是平等的,除非有人说它不同)。
可能是不同的环境。您假设仅对交互式用户有效。您需要记录脚本中发生的事情(请参阅wshshell.LogEvent(intType,strMessage [,strTarget]))。如果你的脚本有
on error remove next
将其删除。
映射驱动器是个问题。与环境变量和特殊文件夹一样。
尝试使用带有各种选项的Runas命令行命令(例如/ env)来查看是否可以复制该行为。
同时运行
cmd /c set > c:\set.log
并比较运行它的两种方式的输出(即与您的客户端和直接方式)。
答案 1 :(得分:0)
感谢您的回答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是真的基本的,因为它只读取文件的第一个字母来决定返回哪个值。实际上,如果没有可用的更新,则消息将始终为"确定 - 没有补丁丢失"。
因此,通过使用SchedulerTask调用bat文件,我们可以了解监视用户没有足够的权限来执行脚本。