Beiträge von mikexmagic
-
-
-
Hallo Leute,
ich habe ein recht umfangreiches Tool geschrieben und möchte nun (um es unsere User ein bisschen zu erklären) so eine Art 'Tour' einbauen. Ich stelle mir das so vor dass bei Tourstart Pfeile und Popups erscheinen und die einzelnen Elemente erklären...
Nun scheitere ich schon daran einen Pfeil über die GUI und die Steuerelemente zu malen... wie auch immer...
Ich habe es mit GDI+ versucht -> Die Graphik wird zwar wie gewünscht erzeugt, lässt sich aber nicht mehr löschen.
Ich habe es mit GUICtrlCreateGraphic versucht -> Der Rahmen ist im Vordergrund, aber die Grafik dann nicht
Ich habe eine Transparente GUI drüber gelegt und eine GIF eingebaut -> auch alles MüllDas kann doch nicht so schwer sein iwie einen Pfeil zu erzeugen den man auch wieder verschwinden lassen kann
Ideen?
-
Stimmt, dann funktioniert es auch!
Danke -
Hier ein MinimalScript:
[autoit]$wmi_node = @computername
[/autoit][autoit][/autoit][autoit]
$wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\root\cimv2');findet alle NICs
[/autoit][autoit][/autoit][autoit]
$wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL")
ConsoleWrite($wmi_qry.count) ;<<<< Zeigt bei mir 16;Nur Wifi
[/autoit]
$wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64", "WQL")
ConsoleWrite($wmi_qry.count) ;<<<< Fehler -
Es gibt extra dafür ein Count-Attribut bei den WMI-Mengen.
Danke... Stimmt. Aber wie bereits beschrieben liefert .count NUR einen Wert wenn auch die Collection Werte enthält.
Ist die Collection leer, bringt die Abfrage auf .count einen Fehler. Daher kommt ja erst das Problem.
Mit meiner eigenen Zählroutine klappts jetzt ganz wunderbar. -
Wieso soll ObjGet falsch sein?
[autoit]
Hat bei mir halt nicht funktioniert. So sollte es richtiger sein...$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
[/autoit]Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.
Da kommt kein Satz zurück. Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.
[autoit]
Richtig: Es kommt kein Satz zurück... Und wie frage ich genau das ab? Habe es jetzt so gelöst:$wmi_count=0
[/autoit]
if IsObj($wmi_qry) Then
For $item in $wmi_qry
$wmi_count=$wmi_count+1
Next
endif
If $wmi_count>0 Then
....
else
....
endif -
Danke... aber hilft nur bedingt bis gar nicht. Mit Scriptomatic hatte ich es auch schon probiert...
Erst einmal ist hier der GetObj() schon falsch bzw unvollständig und ob ExecQuery dann was liefert oder leer bleibt ist auch nicht gelöst...
Werde mir wohl ne Schleife zum Zählen einbauen und danach auswerten... -
Hallo Leute,
ich habe nun schon viele Themen durchsucht und gelesen... Aber irgendwie ist alles Megakompliziert, am Thema vorbei oder was weiß ich....
Eigentlich ist es ganz einfach: Ich möchte per WMI-Abfrage die MAC einer 'evtl' vorhandenen WLAN-Karte auslesen.
Das klappt in der Regel auch einwandfrei mitSELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64
[autoit]$wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\' & $wmi_namespace)
[/autoit]
$wmi_qry = $wmi_obj.ExecQuery($wmi_query)Mein Problem:
Wenn keine WLAN-Karte vorhanden ist (zB. DesktopPC), dann landen mit der Abfrage auch keine Ergebnisse in der Collection.
Mit IsObj($wmi_qry) bekomme ich trotzdem eine '1', das kann ich also nicht als Prüfwert nehmen.
Mit $wmi_qry.Count bekomme ich allerdings dann einen FehlerMuss ich wirklich ein komplettes ErrorHandling einbauen nur um festzustellen ob die Abfrage Ergebnisse brachte oder nicht?
Das muss doch einfacher gehen...Wäre toll wenn mir jemand einen Tip geben könnte!
Gruß Mike
-
Danke Micha_he, aber ich hatte bereits kurz vorher ne Lösung gepostet. Die ist auch getestet von mir und funktioniert.
-
Ich versuche es nochmal zu erklären wo mein Problem ist und zeige die Unterschiede in den Lösungsansätzen auf. Meine Beispiele sind immer Win7 64bit Standarduser...
Fall A) Klick auf Start -> 'regedit' eingeben und Enter drücken. Registry-Editor geht auf, unter HKLM\SOFTWARE ist der Unterschlüssel Wow6432Node sichtbar. Aber natürlich sind keine Änderungen unter HKLM möglich -> Es fehlen die Rechte! (soweit logisch )
[autoit]
Fall B) Klick auf Start -> 'regedit' eingeben -> Suchergebnisse abwarten -> Regedit.exe aus den Suchergebnissen mit rechts anklicken -> 'Als Administrator ausführen' -> UAC möchte Benutzername und Kennwort eines Admins haben -> Registry-Editor öffnet sich. Der Unterschlüssel Wow6432Node ist sichtbar UND kann bearbeitet werden. (Genau so soll es sein! )
Die Lösung: Zwei Apps/Scripte!
Script A stellt die ganz normale GUI dar, ohne #RequireAdmin! Der normale User kann das Tool ganz normal öffnen und benutzen. Beim klick auf den Button [Regedit öffnen] wird Script B gestart. Vereinfacht dargestellt::#RequireAdmin
[/autoit]
RunAs("admin", "lokalerpc", "blablabla", 2 , "C:\Windows\Regedit.exe" , "C:\" )
Die Kombination aus #RequireAdmin UND RunAs() öffnet den Registry-Editor nun so wie gewünscht: HKLM bearbeitbar und Wow6432Node sichtbar!
Danke für Eure Ideen und Hilfe -
Schade, es schein doch ein Verständnis-Problem zu geben. Entweder denke ich zu kompliziert oder es geht einfach nicht...
Ich weiß allerdings auch nicht wie ich es anders erklären soll. :wacko: -
Ja, ich kenne RunAs()
mit rechts klicke und sage 'als Admin ausführen' öffnet sich die Registry anders als wenn ich das aus AUTOIT mit RunAs () mache.
Der wichtige Unterschied: Ich sehe den Pfad HKLM\Software\Wow6432Node nur wenn ich die Regedit über den Rechtsklick öffne...
Auch das DOS-Fenster (cmd.exe) vehält sich per Rechtsklick geöffnet anders als per RunAs()
-
Nein, eine Sicherheitslücke wäre das nicht! Ich möchte ja die UAC Sicherheitsabfrage nicht umgehen, sondern den Aufruf 'als Admin ausführen' vom Script machen lassen.
-
Hallo Freunde der gepflegten Programmierung
also ich fange mal mit den wichtigen Punkten an: Ja, ich habe gesucht! Ja, ich kenne #requireadmin! Ja, ich kenne RunAs()
Die Frage ist allerdings recht banal aber auch wieder nicht: Wie kann ich aus einem Script welches eine normaler User starten darf (also klar OHNE #requireadmin) eine EXE mit 'als Administrator ausführen' aufgerufen werden? Und zwar mit aktivem UAC unter Win7...
Beispiel: Wenn ich auf [Start] klicke und in der Suchzeile 'Regedit' eingebe (ohne ENTER!) und dann auf den Eintrag in den Suchergebnissen mit rechts klicke und sage 'als Admin ausführen' öffnet sich die Registry anders als wenn ich das aus AUTOIT mit RunAs () mache.
Der wichtige Unterschied: Ich sehe den Pfad HKLM\Software\Wow6432Node nur wenn ich die Regedit über den Rechtsklick öffne...
Auch das DOS-Fenster (cmd.exe) vehält sich per Rechtsklick geöffnet anders als per RunAs()
Den einzigen Workaround den ich derzeit habe: Ich starte die kompilierte EXE meines Script mit nem Rechtsklick und 'als Admin'... Dann gehts, aber das ist nicht hilfreich für mein Problem.
Hintergrund zum Script: Es sollen über Schaltflächen halt diverse Tools als Admin ausgeführt werden, die GUI selbst jedoch nicht. Erst beim klicken auf die Buttons soll der UAC noch den Anmeldedaten eines Admins fragen.
Kann die Problematik nachvollzogen werden und gibt es da eine Lösung?
Danke, Gruß Mike
-
Unglaublich... Und bitte jetzt nicht hauen... :wacko:
Da ist es mir doch glatt gelungen die Breite eines Label-Control mit 500 statt mit 50 anzugeben. Somit wurde der Button vom Label überlagert und ließ sich dadurch nicht klicken...
Danke, Death, das war ein hilfreicher Hinweis.
-
Ist das nicht das gleiche? Nur dass statt IF ein SELECT verwendet wird? Ich komme aber mit einer einfachen IF aus das es nur dieses eine Event geben kann.
-
Danke für eine schnelle Antwort. Aber das Problem ist, dass der klick auf den Button überhaupt nicht registriert wird.
Ich habe mir aber auch schon selber geholfen. Allerdings ist das bestimmt nicht die schönste Variante...
Beim öffnen des LogGUI setze ich 'GUIOnEventMode' wieder auf NULL, also auf den MessageMode. Im laufe der WHILE-Schleife für den Log-Output frage ich dann gleichzeitig $msg ab. Klickt man nun auf den Button, wird der Prozess gestoppt und der 'GUIOnEventMode' wird wieder auf EINS gesetzt. usw usw....
[autoit]
[/autoit][autoit][/autoit][autoit]
AutoItSetOption ( "GUIOnEventMode", 0)
Func RefreshLog()
While ProcessExists($hPID)
$msg = GUIGetMsg()
If $msg = $lv_Stoptask Then StopTask()
$readData = StdoutRead($hPID, 1)
If $readData <> $oldData Then
GUICtrlSetData($e_logoutput, @CRLF & $readData)
_GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
$oldData = $readData
EndIf
Wend
EndFuncFunc StopTask()
[/autoit][autoit][/autoit][autoit][/autoit]
LogWrite("stop " & $hPID)
ProcessClose ( $hPID)
ProcessWaitClose ( $hPID)
AutoItSetOption ( "GUIOnEventMode", 1)
EndFunc -
Hallo zusammen,
tja, wie fange ich an? Kompliziertes Problem...
Ich bastel an einer GUI die zum Sichern von lokalen Verzeichnissen nacheinander verschiedene Kopierprozesse startet, und zwar per Robocopy.exe. Die Log-Ausgabe des Prozesses mache ich mit StdOutRead() in einem Edit-Control sichtbar.
Spoiler anzeigen
[autoit]$hPID = Run($backupshare & '\_backupscript\robocopy.exe "' & @mydocumentsdir & '" "' & $backupdestination & '\MyDocuments" /mir /R:0 /W:0',"","",6)
[/autoit]
While ProcessExists($hPID)
$readData = StdoutRead($hPID, 1)
If $readData <> $oldData Then
GUICtrlSetData($e_logoutput, @CRLF & $readData)
_GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
$oldData = $readData
EndIf
Wend
So weit, so gut.
Nun möchte ich aber folgendes realisieren: Es gibt ein MainGUI mit dem Button der die Robocopy-Prozesse nacheinander startet. Das Edit-Feld für den Log-Output habe ich aber in einem anderen GUI-Fenster. Das MainGUI wird deaktiviert und das zweite GUI wird mit @SW_SHOW geöffnet. Der Prozess läuft und im Log läuft die Ausgaben. Das klappt schonmal . In dem zweiten GUI habe ich nun ein Button, welcher den laufenden Prozess abbricht um zum nächsten springt.
Das Problem: Innerhalb der Schleife für den Output reagiert das Script aber nicht auf den klick auf den 'Cancel'-Button...
Das GUI läuft übrigens im 'OnEventMode' weil ich dachte, dass es so gehen würde. Im 'MessageLoopMode' klappt es auch nicht...Verstanden? Ideen?
-
Danke
[autoit]
ich hab die Idee mal aufgegriffen und für meine Zwecke diese zwei kleinen Funktionen gebaut:Func time2sec($t2s_time)$t2s_time_a=StringSplit($t2s_time,":")Return $t2s_time_a[1]*3600+$t2s_time_a[2]*60+$t2s_time_a[3]endfuncFunc sec2time($s2t_seconds)$s2t_seconds=Number($s2t_seconds)$_h=int($s2t_seconds/3600)$_m=int(($s2t_seconds-$_h*3600)/60)$_s=int((($s2t_seconds-$_h*3600)-$_m*60))Return $_h & ":" & Stringformat("%02d",$_m) & ":" & StringFormat("%02d",$_s)endfunc
[/autoit]Einmal wird eine Zeitangabe inkl. Stunden in eine Ganzzahl Gesamtsekunden gewandelt. Damit kann man dann rechnen.
Und die zweite Funktion wandelt eine Zahl dann in Stunden : Minuten : Sekunden um.PS: Wo sind meine Zeilenumbrüche hin?