2014-04-11 51 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 

和輸出從它的兩種方法比較(即與你的客戶直接)。

相關問題