oder Du liest mit RegRead z.B. den AutoAdminLogon-Wert und wenn der auf "1" steht, überspringst Du den Anfang deines Scriptes.
Beiträge von Micha_he
-
-
Das mit dem erneuten ausführen nach dem Neustart, ist doch bei Windows eingebaut:
Das Script/ die Exe nach "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
und unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
folgende (glaub ich jedenfalls) Einträge ausfüllen
DefaultUserName =
DefaultPassword =
AutoAdminLogon = 1Dann wird automatisch der User eingeloggt und das Script/Programm gestartet. Anschließend sollte die Daten für den automatischen Login wieder gelöscht werden. Der "RunOnce"-Schlüssel bereinigt sich alleine.
-
Es soll nur eine Beschreibung des gerade ablaufenden Vorgangs sein, Keine %-Anzeige. Daher müsste ich den Wert, solange die Progressbar läuft, nicht ändern.
-
Ich weiß jetzt nicht ob Dir das etwas hilft oder ob ich Dich falsch verstehe, ich programmiere das immer wie folgt:
Spoiler anzeigen
Code
Alles anzeigen#include <GUIConstants.au3> Dim $bar, $pid, $startbefehl, $i GUICreate("Test",200,100) $bar = GUICtrlCreateProgress (10,15,180,20,$PBS_SMOOTH) GUISetState(@SW_SHOW) $startbefehl = "C:\WINDOWS\system32\notepad.exe" $pid = Run($startbefehl,"",@SW_SHOW,6) While ProcessExists($pid) $i += 1 If $i = 101 then $i = 0 GUICtrlSetData($bar,$i) Sleep(100) Wend While 1 $msg = GuiGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit EndSelect WendHier als Beispiel mit dem Notepad. In Zeile 11 muss die korrekte PID des Prozesses abgefragt werden. Wenn bei mehreren gleichnamigen Prozessen nicht eindeutig klar ist welcher der gestartete ist, lies vor dem Start eine Processliste mit "ProcessList ([name])" ein und vergleiche sie mit eine Liste nach dem Start. So findest Du die passende PID, wenn sie nicht wie in meinem Beispiel beim Start (Zeile 9) ermittelt werden kann.
-
Wenn Du die Häufigkeit eines Wortes in einem String bestimmen willst,
könntest Du doch die Funktion "StringReplace" benutzen. In der Variablen
"@extended"
steht nach der Ausführung (laut der AutoIt-Hilfe) die Anzahl
der Ersetzungen.Und wenn Du nichts ersetzen möchtest, ersetzt Du das gesuchte Wort
durch sich selbst.Gruß
Micha_he -
Besten Dank für den Tip

Dann hätten es aber auch die zwei Zeilen 8 und 19 (ohne Funktion) getan....
Spoiler anzeigen
[autoit]#include <GUIConstants .au3="">
[/autoit] [autoit][/autoit] [autoit]Dim $i, $bar, $lblproz
[/autoit] [autoit][/autoit] [autoit]GUICreate("Progresstest",220,100)
[/autoit] [autoit][/autoit] [autoit]
$bar = GUICtrlCreateProgress (10,15,200,20,$PBS_SMOOTH)
$lblproz = GUICtrlCreateLabel ("Text soll sichtbar bleiben", 10,17,200,20,$SS_CENTER)
GUICtrlSetBkColor($lblproz,$GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor($lblproz,0xFFFFFF)
GUISetState(@SW_SHOW)sleep(2000)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
$msg = GUIGetMsg()
$i += 1
If $msg = $GUI_EVENT_CLOSE Or $i = 101 Then ExitLoop
GUICtrlSetData($bar,$i)
GUICtrlSetState($lblproz,$GUI_Enable)
Sleep(100)
WendGut, flimmern tut es bei mir nicht, schöner wäre es aber, man könnte ein
Objekt fest vor ein anderes stellen. Dann müsste man nicht ständig das
Label wieder nach vorne holen. -
Gibt es eine Möglichkeit, auf/vor einer ablaufenden Progressbar, einen
Text anzuzeigen ? Bei mir verschwindet der Text immer wieder, wenn
ich der Progressbar ein aktuellen Wert zuweise.Hier ein Beispiel:
Spoiler anzeigen
[autoit]#include <GUIConstants .au3="">
[/autoit] [autoit][/autoit] [autoit]Dim $i, $bar, $lblproz
[/autoit] [autoit][/autoit] [autoit]GUICreate("Progresstest",220,100)
[/autoit] [autoit][/autoit] [autoit]
$bar = GUICtrlCreateProgress (10,15,200,20,$PBS_SMOOTH)
$lblproz = GUICtrlCreateLabel ("Text soll sichtbar bleiben", 10,15,200,20,$SS_CENTER)
GUICtrlSetColor($lblproz,0xFFFFFF)
GUISetState(@SW_SHOW)Sleep(2000)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
$msg = GUIGetMsg()
$i += 1
If $msg = $GUI_EVENT_CLOSE Or $i = 101 Then ExitLoop
GUICtrlSetData($bar,$i)
Sleep(100)
Wend -
Hier nun meine gesamte Lösung.
Das Script erstellt eine HTML-Datei über alle Gruppen und deren Mitglieder innerhalb des aktuellen AD.
Spoiler anzeigen
[autoit]; Diese Script erstellt eine Übersicht über alle Gruppen einer Domäne.
[/autoit] [autoit][/autoit] [autoit]
; Zur Ausführung sind Domänen-Admin-Rechte notwendig
; Es wird auch die Primär-Gruppe eines Benutzers beachtet
;
; Es wird die UDF-Datei "ADFunctions.au3" im Unterordner "Include" erwartet
;
; geschrieben von Michael Schröder, 25.07.2007
Opt("MustDeclareVars",1)
#include <include\ADFunctions.au3>Dim $grparray[1], $userarray[1], $grpindex, $userindex
[/autoit] [autoit][/autoit] [autoit]
Dim $memindex, $memarray[1], $file, $name, $mitglieder
Dim $outfile = "ADGruppenuebersicht.htm"SplashTextOn("","Bitte warten, die Datei" & @CRLF & $outfile & @CRLF & "wird erzeugt." ,"400","100","-1","-1",33,"Times New Roman","18","700")
[/autoit] [autoit][/autoit] [autoit]
; Ein Array wird mit allen AD-Gruppen gefüllt
_ADGetAllGroups($grparray,$strDNSDomain)
; Ein Array wird mit allen AD-Usern gefüllt
_ADGetAllUsers($userarray,$strDNSDomain)
; das User-Array wird um eine Spalte mit der 'PrimaryGroup' erweitert
$userarray = _PGroupAdd($userarray)
$file = FileOpen($outfile,1)
; die HTML-Datei wird erzeugt
FileWriteLine($file,"<HTML>")
FileWriteLine($file,"<BODY>")
FileWriteLine($file,"<TABLE BORDER=" & chr(34) & "1" & chr(34) & ">")
FileClose($file)
For $grpindex = 1 to $grparray[0]
; ein Array wird mit den Gruppenmitgliedern gefüllt
_ADGetGroupMembers($memarray,$grparray[$grpindex],1)
; da die User fehlen bei denen diese Gruppe die primäre ist,
; durchsuchen wir das User-Array nach primären Mitgliedschaften
; und fügen diese User an das Array der Gruppen-Mitglieder an
For $userindex = 1 to $userarray[0][0]
If $userarray [$userindex][1] = $grparray[$grpindex] then
_ArrayAdd($memarray,$userarray[$userindex][0])
$memarray[0] = UBound($memarray)-1
EndIf
Next
; sortieren neu
_ArraySort($memarray,0,1)
; und füllen die Tabellenfelder mit Daten
$file = FileOpen($outfile,1)
FileWriteLine($file,"<TR>")
FileWriteLine($file,"<TD>")
FileWriteLine($file,_ADDNToSamAccountName($grparray[$grpindex]))
FileWriteLine($file,"</TD>")
FileWriteLine($file,"<TD>")
For $memindex = 1 to $memarray[0]
$name = _ADDNToSamAccountName($memarray[$memindex])
if $name = "" then
Select
Case StringInStr($memarray[$memindex],"S-1-1-0") > 0
$name = _ADGetWellKnownSIDName($memarray[$memindex])
Case Else
$name = $memarray[$memindex]
EndSelect
EndIf
$mitglieder &= $name & ", "
Next
If $mitglieder <> "" then
FileWriteLine($file, StringLeft($mitglieder,StringLen($mitglieder)-2))
$mitglieder = ""
Else
FileWriteLine($file, " ")
EndIf
FileWriteLine($file,"</TD>")
FileWriteLine($file,"</TR>")
FileClose($file)
Next
; und schließen den HTML-Code ab
$file = FileOpen($outfile,1)
FileWriteLine($file,"</TABLE>")
FileWriteLine($file,"</BODY>")
FileWriteLine($file,"</HTML>")
FileClose($file)
SplashOff(); hier wird mittels zweier ADFunktionen, ein Array mit Usern
[/autoit]
; um die primäre Gruppe, in einer zweiten Spalte erweitert
Func _PGroupAdd($array)
Dim $arrayneu[UBound($array)][UBound($array)]
Dim $index
$arrayneu[0][0] = $array[0]
For $index = 1 to UBound($array)-1
$arrayneu[$index][0] = $array[$index]
$arrayneu[$index][1] = _ADGetPrimaryGroupDN(_ADGetPrimaryGroupID($array[$index]))
Next
Return $arrayneu
EndFunc
Im Anhang ist auch noch eine aktualisierte und erweiterte UDF "ADFunctions.au3" die von obigem Script benötigt wird.Viel Spaß damit
Micha_heEdit BugFix: Bitte Spoiler verwenden
-
Ich nutze den USBAgent von "www.withopf.com/tools/usbagent".
Nur muss er vorher als Admin auf dem Rechner installiert werden und die Datei im Root muss USBAgent.inf heißen.Dafür hat das Programm den Vorteil, das man auch ein Programm beim Entfernen ausführen kann.
Gruß
Micha_he -
Ich habe auch noch eine Lösung:
[autoit]Dim $string = "ab12cd34ef56gh"
[/autoit][autoit][/autoit][autoit]
Dim $index = 1
Dim $array [8]while StringLen($string) >= 2
[/autoit]
$array[$index] = StringLeft($string,2)
$index += 1
If StringLen($string) > 2 then
$string = StringMid($string,3)
Else
$string = ""
EndIf
wend -
Ein Objekt "PrimaryGroupID" hat jeder User. Aber der Wert dieses Objekts lautet z.B. "1107". Wie kann ich jetzt per LDAP die passende Gruppe zu der Nr. 1107 herausfinden ?
Lösung gefunden ! Ich werde den Code noch etwas überarbeiten und stelle dann morgen die Lösung hier ein. Besten Dank trotzdem an alle die versucht haben zu helfen.
Gruß
Micha_he -
Ich suchte aber, passend zu den anderen "ADFunctions", eine LDAP Lösung.
Micha_he
-
Ich habe zu der UDF-Datei "ADFuctions.au3" (http://www.autoitscript.com/forum/index.php?showtopic=37378&hl=adfunctions ) folgende Erweiterungen geschrieben:
1. Ermitteln aller Gruppen unterhalb eine LDAP-Pfades:
Spoiler anzeigen
[autoit]; Function _ADGetAllGroups
[/autoit]
Func _ADGetAllGroups(ByRef $groups,$path)
Dim $objGroup
Dim $item
$objGroup = ObjGet("LDAP://" & $path)
For $item In $objGroup
If $item.class = "group" then
_ArrayAdd ($groups, $item.distinguishedName)
$groups[0] = Ubound($groups)-1
Else
_ADGetAllGroups($groups,$item.distinguishedName)
EndIf
Next
Return
EndFunc
; End Function _ADGetAllGroups2. Eine WellKnownSID in einen Namen umsetzen:
Spoiler anzeigen
[autoit]; Function _ADGetWellKnownSIDName
[/autoit]
Func _ADGetWellKnownSIDName($dn)
Dim $sid
$sid = StringMid($dn,StringInStr($dn,"CN=")+3)
$sid = StringStripWS(StringLeft($sid,StringInStr($sid,",")-1),2)
Select
Case $sid = "S-1-5-32-544"
Return("Administratoren")
Case $sid = "S-1-5-32-547"
Return("Hauptbenutzer")
Case $sid = "S-1-5-32-551"
Return("Sicherungs-Operatoren")
Case $sid = "S-1-5-32-545"
Return("Benutzer")
Case $sid = "S-1-5-7"
Return("Anonymous-Anmeldung")
Case $sid = "S-1-5-11"
Return("Authentifizierte Benutzer")
Case $sid = "S-1-5-3"
Return("Batch")
Case $sid = "S-1-3-0"
Return("Ersteller-Besitzer")
Case $sid = "S-1-3-1"
Return("Erstellergruppe")
Case $sid = "S-1-5-1"
Return("Dialup")
Case $sid = "S-1-1-0"
Return("Jeder")
Case $sid = "S-1-5-4"
Return("Interaktiv")
Case $sid = "S-1-5-18"
Return("System")
Case $sid = "S-1-5-2"
Return("Netzwerk")
Case $sid = "S-1-5-10"
Return("Selbst")
Case $sid = "S-1-5-6"
Return("Service")
Case $sid = "S-1-5-13"
Return("TerminalserverBenutzer")
Case $sid = "S-1-5-1000"
Return("Andere Organisation")
Case $sid = "S-1-5-15"
Return("Diese Organisation")
Case Else
Return()
EndSelect
EndFunc
; End Function _ADGetWellKnownSIDNameNun ermittele ich alle Mitglieder einer Gruppe mit der Originalfunktion "_ADGetGroupMembers" aus der "ADFunctions.au3". ( Hier der Code: )
Spoiler anzeigen
[autoit]Func _ADGetGroupMembers(ByRef $members, $groupdn, $sort = 0)
[/autoit] [autoit][/autoit] [autoit]
;If _ADObjectExists($group) = 0 Then Return 0
Local $oUsr, $objCommand, $groups$objCommand = ObjCreate("ADODB.Command")
[/autoit] [autoit][/autoit] [autoit]
$objCommand.ActiveConnection = $objConnection
$objCommand.Properties ("Searchscope") = 2Dim $members[1]
[/autoit] [autoit][/autoit] [autoit]
$i = 0While 1
[/autoit] [autoit][/autoit] [autoit]
$rangemodifier = $i * 1000
$range = "Range=" & $rangemodifier & "-" & $rangemodifier + 999
$strCmdText = "<LDAP://" & $strHostServer & "/" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields (0).Value
If $membersadd = 0 Then ExitLoop
ReDim $members[UBound($members) + 1000]
For $j = $rangemodifier + 1 To $rangemodifier + 1000
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next
$i += 1
$objRecordSet.Close
WEnd$rangemodifier = $i * 1000
[/autoit] [autoit][/autoit] [autoit]
$range = "Range=" & $rangemodifier & "-*"
$strCmdText = "<LDAP://" & $strHostServer & "/" & $groupdn & ">;;member;" & $range & ";base"
$objCommand.CommandText = $strCmdText
$objRecordSet = $objCommand.Execute
$membersadd = $objRecordSet.fields (0).ValueReDim $members[UBound($members) + UBound($membersadd) ]
[/autoit] [autoit][/autoit] [autoit]For $j = $rangemodifier + 1 To $rangemodifier + UBound($membersadd)
[/autoit] [autoit][/autoit] [autoit]
$members[$j] = $membersadd[$j - $rangemodifier - 1]
Next$objRecordSet.Close
[/autoit]
$members[0] = UBound($members) - 1
If $sort = 1 Then
_ArraySort($members, 0, 1)
EndIf
Return 1
EndFunc ;==>_ADGetGroupMembersDiese Funktion gibt mir zwar einige der Mitglieder aus, es fehlen aber die Mitglieder, die die jeweilige Gruppe als PRIMÄRE Gruppe haben ! Das heißt jeder User fehlt in der Gruppe, die seine primäre Gruppe ist.
Hat jemand eine Idee für eine Erweiterung / Verbesserung ?
Oder hat jemand zufällig eine eigene Funktion geschrieben ?Gruß
Micha_he -
Super... das wars
Aber aus der Hilfe ist das mit dem Konstrukt "[^[:CLASS:]]" nicht zu erlesen !
Besten Dank für eure Hilfe
-
Scheinbar funktionieren die Classes (wie [:alpha:] oder [:xdigit:]) bei den regulären Ausdrücken nicht richtig. Folgendes Script soll eigentlich alle nicht alphanumerischen Zeichen finden (wie in der zweiten Ausgabe).
Das haut aber nicht so richtig hin. Auch andere Classes scheinen nicht richtig zu funktionieren oder was mache ich da falsch ?Beispiel:
$text = "ab-AB_äöüß_109"
msgbox(0,"",StringRegExpReplace($text,"[^:alpha:]","."))
msgbox(0,"",StringRegExpReplace($text,"[^a-zA-Z0-9]",".")) -
Da ich nicht den AutoIt-Editor zum Schreiben nutze und per Kontextmenü kompiliere, benutze ich folgendes kompiliertes Script per Kontextmenü, anstatt des Standard "Compile"-Befehls:
[autoit]; Programmname: Aut2Exe_wOpt.au3
[/autoit][autoit][/autoit][autoit]
; Version: 1.03
; geschrieben von: Michael Schröder
; geschrieben am: 05.04.2007
;
; Beschreibung:
;
; Ermöglicht das kompilieren über das Kontextmenü unter
; Berücksichtigung foilgender optionen im Quelltext des
; Scriptes:
;
; #compiler_icon=
; #compiler_outfile=
;
; Eingebunden wird die kompilierte Version dieses Scriptes
; in der Registry unter :
;
; [HKEY_CLASSES_ROOT\AutoIt3Script\shell\Compile]
; @="Compile Script With Options"
;
; [HKEY_CLASSES_ROOT\AutoIt3Script\shell\Compile\Command]
; @="C:\\Programme\\AutoIt3\\Aut2Exe\\Aut2Exe_wOpt.exe \"%l\""#compiler_outfile="Aut2Exe_wOpt.exe"
[/autoit][autoit][/autoit][autoit]Dim $in_id
[/autoit][autoit][/autoit][autoit]
Dim $icon = ""
Dim $out_name = ""
Dim $path
Dim $prg
Dim $inhalt$in_id = FileOpen($cmdline[1],0)
[/autoit][autoit][/autoit][autoit]
$inhalt = FileRead($in_id)
FileClose($in_id)
Sleep(2000)if StringInStr($inhalt,@CRLF & "#compiler_icon") > 0 then
[/autoit][autoit][/autoit][autoit]
$icon = StringReplace(StringStripWS(StringMid($inhalt,StringInStr($inhalt,@CRLF & "#compiler_icon")+17,StringInStr(StringMid($inhalt,StringInStr($inhalt,@CRLF & "#compiler_outfile")+20),@CRLF)),3),chr(34),"")
endifif StringInStr($inhalt,@CRLF & "#compiler_outfile") > 0 then
[/autoit][autoit][/autoit][autoit]
$out_name = StringReplace(StringStripWS(StringMid($inhalt,StringInStr($inhalt,@CRLF & "#compiler_outfile")+20,StringInStr(StringMid($inhalt,StringInStr($inhalt,@CRLF & "#compiler_outfile")+20),@CRLF)),3),chr(34),"")
endif$path = StringLeft($cmdline[1], StringInStr($cmdline[1],"\",0,-1))
[/autoit]
$prg = "Aut2Exe.exe /in " & chr(34) & $cmdline[1] & chr(34)
if $out_name <> "" then $prg &= " /out " & chr(34) & $path & $out_name & chr(34)
if $icon <> "" then $prg &= " /icon " &chr(34) & $path & $icon & chr(34)
$prg &= " /comp 4"
RunWait($prg,@scriptdir) -
Hallo...
Ich suche nach einer Möglichkeit ohne zusätzliches Commandline-Tool, eine SnmpGet oder SnmpWalk-Anfrage an einen Server zu senden.
Also z.B. mittels TCPSend oder eines DLL-Aufrufs. Gibt es hierfür einen Lösungsvorschlag ?Besten Dank für Eure Ideen...
Micha -
Das mit 2.147.483.647 Zeichen(Byte) passt scheinbar nicht.
Ich habe mit einem Test-ScriptCode
Alles anzeigendim $i,$x,$y for $i = 1 to 1024 $x &= "x" next GUICreate("Stringtest",400,200) $label = GUICtrlCreateLabel("0",20,20,360,20) GUISetState() $i = 1 while $i < 1000000000 $y &= $x GUICtrlSetData($label,$i & " kB") $i += 1 wend msgbox(0,"","fertig")eine Variable mit 1k Stücken gefüllt. Egal welcher Rechner, der Fehler kommt immer bei ca. 512 MB.
Es ist zwar für mein eigentliches Problem nicht mehr wichtig ( ich lese jetzt kleinere Teile des Files ), aber scheinbar passen NUR 512MB in eine Variable.Gruß
Micha -
Ich meinte natürlich Datenbank-Freischaltung...
Ich sah gerade das es auch eine Filebase im Forum gibt. -
Das wären dann 4095 Byte ?! Das kann aber eigentlich nicht sein.
Zur Zeit lese ich 10MB-Teile und das scheint zu funktionieren.
Sogar 100MB gingen scheinbar fehlerfrei.