Sign in to follow this  
Followers 0
Deon

Getting uptime of a remote system as another user

2 posts in this topic

Apologies for making this a bit of a complicated one...

I'm looking for a remote uptime script. I've found a few, and something like one of the below would probably do... however I need to be able to run the script as another user.

 
For security, we don't use our domain admin accounts on a day-to-day basis, only when we need to run scripts that require domain admin permissions. Eg, I'm logged in all day as $regularuser and use $domainadmin when I log into a server... $regularuser doesn't have admin rights on the servers, so this code must be executed as $domainadmin.
 
The script will be placed in a network share, so I can't use RunAs in Windows, because when the session is created for the RunAs user ($domainadmin), the network share will not be mapped and the script won't be found.
 
 
Any ideas?  :)
 
 

#AutoIt3Wrapper_Change2CUI=Y
#include <Date.au3>

$strComputer = "."
If $cmdline[0] Then
    If StringInstr($cmdlineraw,"?") Then
        ConsoleWrite(@CRLF & "Description:" & @CRLF & @TAB & "Displays system up time for local or remote machines." & @CRLF)
        ConsoleWrite(@CRLF & "Parameter List:" & @CRLF & @TAB & "/?" & @TAB & @TAB & @TAB & "Displays this help/usage." & @CRLF)
        ConsoleWrite(@CRLF & "Examples:" & @CRLF & @TAB & @ScriptName & @CRLF)
        ConsoleWrite(@TAB & @ScriptName & " hostname1 hostname2 hostname3" & @CRLF)
        Exit
    EndIf
    For $x = 1 To $cmdline[0]
        ConsoleWrite(StringUpper($cmdline[$x]) & " " & _Uptime($cmdline[$x])&@CRLF)
    Next
Else
    ConsoleWrite(_Uptime($strComputer) & @CRLF)
EndIf

Func _Uptime($strComputer)
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
    If Not IsObj($objWMIService) Then Return "Failed to Connect"
    $colOperatingSystems = $objWMIService.ExecQuery("Select LastBootUpTime from Win32_OperatingSystem")
    For $objOS in $colOperatingSystems
        $dtmBootup = $objOS.LastBootUpTime
        $dtmLastBootupTime = _WMIDateStringToDate($dtmBootup)
    Next
   
    Return _FormatUptime($dtmLastBootupTime)
EndFunc

Func _WMIDateStringToDate($dtmBootup)
    Return StringLeft($dtmBootup,4) & "/" & StringMid($dtmBootup, 5, 2) & "/" & StringMid($dtmBootup, 7, 2) & " " & StringMid($dtmBootup, 9, 2) & ":" & StringMid($dtmBootup, 11, 2) & ":" & StringMid($dtmBootup, 13, 2)
EndFunc

Func _FormatUptime($dtmLastBootupTime)
    Dim $arrdatediffs[4][3]=[[0,24," day"],[0,60," hour"],[0,60," minute"],[0,1," second"]]
    $datediff = StringSplit("D|h|n|s","|")
    $tNow = _NowCalc()
    For $diff = 1 to $datediff[0]
        $arrdatediffs[$diff-1][0] = _DateDiff($datediff[$diff], $dtmLastBootUpTime, $tNow)
    Next
    $ubound = UBound($arrdatediffs)-1
    For $x = $ubound To 0 Step -1
        If $x > 0 Then
            If $arrdatediffs[$x-1][0] > 0 Then $arrdatediffs[$x][0] = ($arrdatediffs[$x][0]-($arrdatediffs[$x-1][0]*$arrdatediffs[$x-1][1]))
        EndIf
    Next
    $strUptime = ""
    For $x = 0 To $ubound
        If $arrdatediffs[$x][0] > 0 Then
            $strUptime &= $arrdatediffs[$x][0] & $arrdatediffs[$x][2]
            If $arrdatediffs[$x][0] > 1 Then $strUptime &= "s"
            If $x < $ubound Then $strUptime &= ", "
        EndIf
    Next
    Return $strUptime
EndFunc
 

or
 

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
 
Local $strComputer = InputBox("Which computer?","Enter Computer name")
 
$Output=""
$Output = $Output & "Computer: " & $strComputer  & @CRLF
$Output = $Output & "==========================================" & @CRLF
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_System", "WQL", _
                                          $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
 
If IsObj($colItems) then
   For $objItem In $colItems
        $uptime = $objItem.SystemUpTime
        If $uptime > 60 Then
            $uptime = $uptime / 60; convert the seconds to minutes
            If $uptime > 60 Then
                $uptime = $uptime / 60; convert the minutes to hours
                If $uptime > 24 Then; convert hours to days
                    $uptime = Number(StringFormat("%.2f",$uptime / 24))
                    If $uptime > 1.0 Then; uptime more than 1 day
                        $Output = $Output & "SystemUpTime: " & $uptime & @CRLF
                        if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
                    EndIf
                EndIf
            EndIf
        EndIf
      $Output=""
   Next
Else
   Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_PerfFormattedData_PerfOS_System" )
Endif

Share this post


Link to post
Share on other sites



hello Deon, welcome to AutoIt and to the forum!

The script will be placed in a network share, so I can't use RunAs in Windows, because when the session is created for the RunAs user ($domainadmin), the network share will not be mapped and the script won't be found.

 
Any ideas?  :)
 

 

you can use RunAs, but do not use a drive letter, use the UNC path instead.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0