Hallo zusammen,
dies ist mein erster Post, also bitte seit etwas gnädig und verzeiht mir vielleicht den ein oder anderen Fehler bei der Formatierung
Ich habe ein Problem mit einem von mir erstellten Script, welcher von meinem Vorgesetzen angefragt wurde.
Ich habe mit AutoIT bisher noch nie etwas zu tun gehabt und habe mir bisher alles mit den Beispielen und viel gegoogle beigebracht.
Nun brauche ich aber einen Tipp von euch. Vielleicht gibt es einen viel einfacheren weg, wie meinem:
Also, Anforderung ist, alle möglichen werde eines Computers auszulesen. Bisher lese ich Daten aus wie:
- Username (@Username)
- Computername (@Computername)
- Windows OS, System Version (ServicePacks), Prozessor usw via Registery
Dauer von Programmstarts und Copyjobs von Servern
Eine wichtige Anforderung allerdings ist das Auslesen der Computer Startup Informationen.
Wie löse ich das bisher?
Ich lasse die Powershell via "Run ('powershell.exe')" starten und gebe die Befehle mit "send" befehlen ein und lasse diese dann mit ("{ENTER}") bestätigen. Ein Beispiel hänge ich weiter unten an.
Ebenfalls muss ich die Ausgabe über das Notepad formatieren, da ich in der Powershell Ausgabe, welche ich über die Zwischenablage gerundet in Sekunden in ein Array schreibe, einen Zeilenumbruch drin habe. Also Hat mich nur alleine dieser Punkt schon einiges an Nerven gekostet.
Ihr schlagt möglicherweise nun die Hände über dem Kopf zusammen und denkt: "Mensch ist der blöd.. das geht doch so ... viel einfacher"
Anbei der Script (allerdings ohne die vorher erstellten Variablen und aktivierten Erweiterungen, nur der Rohe Script um die Registery auszulesen):
Func StartupInformation() ;Get Computer startup information via Windows Powershell from Eventlog (Microsoft-Windows-Diagnostics-Performance/Operational)
Run ('powershell.exe')
Sleep (1500)
send ("cd C:\TimeToTest\") ;change directory for Powershell Commands (needed?)
send ("{ENTER}")
send ("$Event = Get-WinEvent -FilterHashTable @{{}LogName = ""Microsoft-Windows-Diagnostics-Performance/Operational""; ID=100{}} -MaxEvents 1") ;Get Windows Event Microsoft-Windows-Diagnostics-Performance/Operational and add last Event with ID 100 to array "$Event"
send ("{ENTER}")
send ("$eventXML = [xml]$Event.ToXml()") ;convert Array to XML
send ("{ENTER}")
send ("$eventXML.Event.EventData.Data[1].'#text' | clip",1) ;Extract "Text" of BootStartTime to Clipboard, convert via Notepad to Solve the round issue because of a wordwrap in clipboard
send ("{ENTER}")
send ("start Notepad.exe")
send ("{ENTER}")
Sleep (250)
send ("{CTRLDOWN}")
send ("v")
send ("{CTRLUP}")
Sleep (250)
send ("{BACKSPACE}")
send ("{CTRLDOWN}")
sleep (250)
send ("a")
sleep (250)
send ("x")
send ("{CTRLUP}")
sleep (250)
send("!+{F4}",0)
Sleep (250)
Local $BootStartTime = ClipGet()
Sleep (250)
send ("$eventXML.Event.EventData.Data[2].'#text' | clip",1) ;Extract "Text" of BootEndTime to Clipboard, convert via Notepad to Solve the round issue because of a wordwrap in clipboard
send ("{ENTER}")
send ("start Notepad.exe")
send ("{ENTER}")
Sleep (250)
send ("{CTRLDOWN}")
send ("v")
send ("{CTRLUP}")
Sleep (250)
send ("{BACKSPACE}")
send ("{CTRLDOWN}")
sleep (250)
send ("a")
sleep (250)
send ("x")
send ("{CTRLUP}")
sleep (250)
send("!+{F4}",0)
Sleep (250)
Local $BootEndTime = ClipGet()
Sleep (250)
send ("$eventXML.Event.EventData.Data[5].'#text' | clip",1) ;Extract "Text" of BootTime in MS to Clipboard, convert via Notepad to Solve the round issue because of a wordwrap in clipboard
send ("{ENTER}")
send ("start Notepad.exe")
send ("{ENTER}")
Sleep (250)
send ("{CTRLDOWN}")
send ("v")
send ("{CTRLUP}")
Sleep (250)
send ("{BACKSPACE}")
send ("{CTRLDOWN}")
sleep (250)
send ("a")
sleep (250)
send ("x")
send ("{CTRLUP}")
sleep (250)
send("!+{F4}",0)
Sleep (250)
Local $BootTime_MS = ClipGet()
Sleep (250)
send ("$eventXML.Event.EventData.Data[6].'#text' | clip",1) ;Extract "Text" of MainPathBootTime in MS to Clipboard, convert via Notepad to Solve the round issue because of a wordwrap in clipboard
send ("{ENTER}")
send ("start Notepad.exe")
send ("{ENTER}")
Sleep (250)
send ("{CTRLDOWN}")
send ("v")
send ("{CTRLUP}")
Sleep (250)
send ("{BACKSPACE}")
send ("{CTRLDOWN}")
sleep (250)
send ("a")
sleep (250)
send ("x")
send ("{CTRLUP}")
sleep (250)
send("!+{F4}",0)
Sleep (250)
Local $MainBootTime_MS = ClipGet()
Sleep (250)
send ("$eventXML.Event.EventData.Data[19].'#text' | clip",1) ;Extract "Text" ot BootPostBootTime to Clipboard, convert via Notepad to Solve the round issue because of a wordwrap in clipboard
send ("{ENTER}")
send ("start Notepad.exe")
send ("{ENTER}")
Sleep (250)
send ("{CTRLDOWN}")
send ("v")
send ("{CTRLUP}")
Sleep (250)
send ("{BACKSPACE}")
send ("{CTRLDOWN}")
sleep (250)
send ("a")
sleep (250)
send ("x")
send ("{CTRLUP}")
sleep (250)
send("!+{F4}",0)
Sleep (250)
Local $PostBootTime_MS = ClipGet()
Sleep (250)
send ("exit", 1)
send ("{ENTER}")
Sleep (250)
;Calculate from MS to Sec
Local $BootTime_Sec = Round($BootTime_MS /1000) ;Calculate BootTime from Milliseconds to Seconds
Local $MainBootTime_Sec = Round($MainBootTime_MS /1000) ;Calculate MainBootTime from Milliseconds to Seconds
Local $PostBootTime_Sec = Round($PostBootTime_MS /1000) ;Calculate PostBootTime from Milliseconds to Seconds
;Write Information to Array $arr_ComputerStartUpInformation
Global $arr_ComputerStartUpInformation[1][$iCountArrayStartInfo] = [[$BootStartTime, $BootEndTime, $BootTime_Sec, $MainBootTime_Sec, $PostBootTime_Sec]]
EndFunc ;==> StartupInformation
Alles anzeigen
So, und nun kommt mein Problem:
Ich habe alles bisher immer mit lokalen Administratoren Rechten getestet (ich weiß... Dummer Fehler..).
Nun haben alle unseren Benutzer, welche nicht in der IT arbeiten, keine lokalen Admin Rechte.
Zum auslesen via Powershell benötige ich allerdings Admin recht.
Also nicht lange überlegt und die Powershell mit "RunAs" gestartet. Dummerweise schreibt mir der "Send" Befehl aber nichts in das "Admin" Powershell Fenster.
es bleibt einfach leer und der Script läuft unbeirrt weiter, als wäre alles okay, nur das meine Variablen / Arrays leer sind.
Nun meine Fragen:
1. Warum ist das so?
2. Wie kann ich das lösen? Ich werde noch wahnsinnig!
3. Gibt es vielleicht eine viel einfachere Lösung dafür, als diesen super langen und umständlichen Script, für das Auslesen der Bootzeit? Was wichtig wäre: Die Zeit, die der Benutzer zum eingeben des Passworts braucht, soll nicht mit erfasst werden. Daher "MainBootTime" (Vom laden der Winload.exe bis zum Anmeldebildschirm) und die "Post Boot Time" (Vom Anmelden bis zu dem Zeitpunkt, bis die CPU einige Sekunden idle ist)
Ich wäre euch für jeden Tipp, für jede Erklärung und sei es auch nur für ein Stichwort zur Lösung sehr dankbar!
Grüße
Hector