2014-04-11 21 views
0

我会尽我所能详细描述,以便您了解我正在处理的环境以及我正在尝试执行的操作。从本身(Nagios/NSclient)作为管理员运行一个vbscript

我在工作中使用Nagios来监视我们的服务器。我们的每台Windows服务器都安装了NSclient ++。 Nagios调用的其中一个脚本是check_updates.vbs;这里是怎么一回事,如果有人需要知道:

在Nagios的服务器端,我们执行以下命令:

/usr/lib/nagios/plugins/check_nrpe -H WindowsServerIpAddress -p 5666 -t 120 -c check_updates 

当我们执行该命令,这里是正在发生的事情在Windows服务器上:

通过使用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服务器上,我们有一个简单的(但是致命的)错误,说权限被拒绝

这就是为什么我们专注于为监控用户提供足够的权限。

经过越来越多的搜索和尽我们所能,我必须说我们现在有点失落。

我想最后的解决办法是在脚本的开头添加这些行,给监控用户足够的权限来执行正确的脚本:

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服务并非我们正在寻求解决此问题的解决方案。

那么,我在这里错过了什么吗?你有什么想法吗?

感谢您的帮助! :)

[*错误声明]:无效的参数,查看帮助与Cscript.exe将check_available_updates.vbs -h

回答

0

感谢您的回答托尼,我试过了您的建议,但最终我们终于解决了这个问题。

尽管我们为监控用户提供了执行此脚本所需的所有权限,但它无法正常工作。因此,这里是我们做了什么:

我们创建了包含命令行来调用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文件,我们解决了监控用户没有足够权限执行脚本的事实。

0

如果UAC是关闭的,然后它不是一个UAC权限错误,因此不必担心运行方式。

这也不太可能是一个文件权限问题(所有管理员都是平等的,除非有人让它不同)。

可能是不同的环境。您对交互式用户的假设是正确的。您需要记录脚本中发生了什么(请参阅wshshell.LogEvent(intType,strMessage [,strTarget]))。如果您的脚本有

on error remove next 

删除它。

映射驱动器是一个问题。正如环境变量和特殊文件夹一样。

尝试使用带有各种选项(例如/ env)的Runas命令行命令来查看是否可以复制该行为。

而且运行

cmd /c set > c:\set.log 

和输出从它的两种方法比较(即与你的客户直接)。

相关问题