首页 文章

以管理员身份运行vbscript(Nagios / NSclient)

提问于
浏览
0

我会详细说明,以便您了解我正在处理的环境以及我想要做的事情 .

我正在使用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服务器上,我们有一个简单(但致命)错误,表示权限被拒绝 .

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

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

我尝试的最后一个解决方案是在脚本开头添加这些行,以便为监视用户提供足够的权限来正确执行脚本:

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的帮助

2 回答

  • 0

    如果UAC关闭,那么它不是UAC权限错误,因此不要担心runas .

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

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

    on error remove next
    

    去掉它 .

    映射驱动器是一个问题 . 作为环境变量和特殊文件夹 .

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

    还跑

    cmd /c set > c:\set.log
    

    并比较两种运行方式的输出(即与您的客户端和直接) .

  • 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是 really basic,因为它只读取文件的第一个字母来决定返回哪个值 . 实际上,如果没有可用的更新,则消息将始终为"OK - No patches missing" .

    因此,通过使用SchedulerTask调用bat文件,我们可以了解监视用户没有足够的权限来执行脚本 .

相关问题