从自身以管理员身份运行 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)的主要内容,如果未能解决你的问题,请参考以下文章

检索用户的桌面文件夹VBScript

VBScript执行成功后如何关闭CMD提示窗口

如何以管理员身份从 Windows 命令行运行命令?

如何以不同用户和管理员身份从命令提示符运行程序 [关闭]

如何从命令提示符以“以管理员身份运行”运行应用程序? [关闭]

soildworks2019安装时以管理员身份运行server_install.bat时出错了?