2014-04-11 3 views
0

제가 할 수있는 한 자세하게 설명해 드리겠습니다. 제가 작업하고있는 환경과 내가하려는 일을 이해할 수 있습니다.자체에서 관리자로 vbscript를 실행하십시오 (Nagios/NSclient)

저희 서버를 모니터링하기 위해 직장에서 Nagios를 사용하고 있습니다. 각각의 Windows 서버에는 NSclient ++가 설치되어 있습니다. Nagios가 호출하는 많은 스크립트 중 하나는 check_updates.vbs입니다. 여기에 누군가가 알 필요가 있다면 어떻게되는지 S : Nagios의에

'

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

우리가 그 명령을 실행하면, 여기에 윈도우 서버에 무슨 일이 일어나고 있는지입니다 서버 측을, 우리는 다음과 같은 명령을 실행 다음 NSCP 서비스를 사용하여

, 그것은 (NSclient ++ 폴더)를 nsclient.ini 파일에 정의 된 다음 명령을 호출합니다

check_updates=cscript.exe //T:120 //NoLogo scripts\\check_updates.vbs 

그런 다음 check_updates.vbs script을 호출합니다.


Windows 서버의 로컬 계정은 관리자 계정입니다. 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 

(I이 here 발견) :

해봤 마지막 솔루션은 모니터링 사용자에게 적절하게 스크립트를 실행하기에 충분한 권한을 부여, 스크립트의 시작 부분에 다음 줄을 추가했다

이것을 사용하면 로컬에서 [오류 통지 *]가 표시되지만 스크립트가 작동합니다. 그러나 원격으로 스크립트를 호출하면 120 초 후에 만 ​​시간 제한이 생깁니다.

추가 정보 : UAC는 Windows 서버에서 비활성화되며 모니터링 사용자는 NSclient ++ \ scripts 폴더에 대한 모든 권한을 갖습니다. 관리자 계정에 nscp 서비스를 사용하는 것은 우리가이 문제에 대해 찾고있는 해결책이 아닙니다.

그래서 여기에 뭔가가 빠졌습니까? 이거 좀 생각해?

도움 주셔서 감사합니다. :)

[* 오류 통지] : 잘못된 인수, UAC가 꺼져 다음 따라서 RUNAS에 대해 걱정하지 않는 UAC 권한 오류가 아니라면 cscript.exe를 check_available_updates.vbs이

답변

0

답장을 보내 주셔서 감사합니다. 토니, 귀하의 제안을 시도했지만 결국 문제를 해결할 수있었습니다.

우리는이 스크립트를 실행하는 데 필요한 모든 권한을 모니터링 사용자에게 제공했지만 작동하지 않았습니다. 그래서 여기에 우리가 한 작업은 다음과 같습니다

우리는 check_update.vbs를 호출하고 새 파일에 출력을 작성하는 명령 줄이 포함 된 박쥐 파일 생성 : 우리는했습니다 그런

cscript.exe //T:120 //NoLogo "C:\Program Files\NSClient++\scripts\check_updates.vbs" > "C:\Program Files\NSClient++\check_update.log" 

을 bat 파일을 매일 호출하여 새 업데이트를 확인하는 예약 된 작업 (TaskScheduler 사용)을 만들었습니다. 이후,이 VBScript를 정말 기본 입니다

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) 

:

은 Nagios의 올바른 출력을 위해, 우리는 단지 check_update.log 파일을 읽고 Nagios의에 대한 적절한 값을 반환하는 또 다른 VBScript를 만들어 반환 할 값을 결정하기 위해 파일의 첫 번째 문자 만 읽습니다. 실제로 사용 가능한 업데이트가없는 경우 메시지는 항상 "확인 - 누락 된 패치 없음"입니다.

따라서 SchedulerTask를 사용하여 bat 파일을 호출하면 모니터링 사용자가 스크립트를 실행할 권한이 부족하다는 사실을 알 수 있습니다.

0

을 -h 도움말을 확인하십시오.

파일 권한 문제 일 가능성도 거의 없습니다. (누군가 다른 사람이 변경하지 않는 한 모든 관리자는 동일합니다.)

다른 환경 일 가능성이 있습니다. 대화 형 사용자에게만 적용되는 가정이 있습니다. 스크립트에서 발생한 일을 기록해야합니다 (wshshell.LogEvent (intType, strMessage [, strTarget]) 참조). 스크립트에있는 경우

on error remove next 

제거하십시오.

매핑 된 드라이브가 문제입니다. 환경 변수와 특수 폴더가 그렇습니다.

다양한 옵션 (예 :/env)으로 Runas 명령 줄 명령을 사용하여 동작을 복제 할 수 있는지 확인하십시오.

또한

cmd /c set > c:\set.log 

을 실행하고 실행하는 두 가지 방법의 출력을 비교 (즉, 클라이언트와 직접 포함).