Meiner Meinung nach müsste der DN verkehrt sein. Es sollte heißen:
DIM $Array[500]
_ADGetObjectsInOU($Array,"OU=TESTOU,DC=MeineDomain,DC=local")
Aber meine Aussage ist jetzt ohne das ich genau weiß, ob der Aufruf der Funktion richtig ist.
Meiner Meinung nach müsste der DN verkehrt sein. Es sollte heißen:
DIM $Array[500]
_ADGetObjectsInOU($Array,"OU=TESTOU,DC=MeineDomain,DC=local")
Aber meine Aussage ist jetzt ohne das ich genau weiß, ob der Aufruf der Funktion richtig ist.
Wie kann ich so etwas harausfinden, das die Funktion "Str, DWord, Ptr, Dword, Dword*" benötigt ?
Gibt es da für AutoIt-User eine brauchbare Hilfe oder Webseite ?
Oder eine Übersetzung? Laut MSDN sieht der Aufruf ja wie folgt aus:
BOOL WINAPI GetFileSecurity(
__in LPCTSTR lpFileName,
__in SECURITY_INFORMATION RequestedInformation,
__out_opt PSECURITY_DESCRIPTOR pSecurityDescriptor,
__in DWORD nLength,
__out LPDWORD lpnLengthNeeded
);
Wie komme ich von da aus, auf eine funktionierende AutoIt-Version, wie sie 'progandy' gezeigt hat ?!?
@progandy: Danke aber für die Hilfe !
Hilfe !!!
Ich habe mal den Anfang probiert. Aber DllCall ist mir scheinbar ainfach zu hoch...
Warum bekomme ich bei meiner Umsetzung nix (aber auch gar nix) zurück ?
#include <array.au3>
Opt("MustDeclareVars",1)
Const $OWNER_SECURITY_INFORMATION = 0x1
Const $GROUP_SECURITY_INFORMATION = 0x2
Const $DACL_SECURITY_INFORMATION = 0x4
Dim $sFile, $hAdvapi32, $aSecu
$sFile = @scriptfullpath
;$sFile = @scriptdir & "\dummy.txt"
$hAdvapi32 = DllOpen("advapi32.dll")
$aSecu = DllCall($hAdvapi32,"long","GetFileSecurity", _
"str",$sFile, _
"long", $DACL_SECURITY_INFORMATION, _
"byte","", _
"long",0, _
"long",0)
DllClose($hAdvapi32)
_arrayDisplay($aSecu)
[/autoit]Besteht unter Umständen die Möglichkeit auf die Funktionen "SetFileSecurity" und "GetFileSecurity" der ADVAPI32.DLL zuzugriefen und es damit zu lösen ?
Ggf. auch Get-/SetNamedSecurityInfo der gleichen Bibliothek ? Ein kurze Bespiel in VB oder VBS habe ich leider nicht gefunden...
Besten Dank nochmal
Nicht nur die Titelleiste, sondern auch die Rahmen ! Sonst wäre das GUI ja nicht auch breiter geworden.
GUI ist eben nicht WINDOW. Und es heist WINMOVE !
So haut es hin:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $ini = @scriptdir & "\WMDE.ini"
Global $ToolTitle = "Window Management +"
$x = IniRead($ini, "Settings", "x", "-1")
$y = IniRead($ini, "Settings", "y", "-1")
$w = IniRead($ini, "Settings", "w", "555")
$h = IniRead($ini, "Settings", "h", "281")
#Region ### START Koda GUI section ### Form=o:\autoscripts\window management\form1.kxf
[/autoit] [autoit][/autoit] [autoit]$Form1_1 = GUICreate($ToolTitle,555,281,-1,-1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU ,$DS_SETFOREGROUND, $WS_SIZEBOX), $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$Tab = GUICtrlCreateTab(0, 0, $w, $h)
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
$TabSheet1 = GUICtrlCreateTabItem("Windows")
$ListView1 = GUICtrlCreateListView("", 3, 23, $w - 5, $h - 28, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_SUBITEMIMAGES, $WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_HEADERDRAGDROP,$LVS_EX_FULLROWSELECT))
$exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_HEADERDRAGDROP)
_GUICtrlListView_SetExtendedListViewStyle($ListView1, $exStyles)
GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKAUTO)
WinMove($Form1_1,"",$x,$y,$w,$h)
GUISetState(@SW_SHOW, $Form1_1)
While 1
Sleep(100)
WEnd
Func _Exit()
$WinPos = WinGetPos($Form1_1)
IniWrite($ini, "Settings", "x", $WinPos[0])
IniWrite($ini, "Settings", "y", $WinPos[1])
IniWrite($ini, "Settings", "w", $WinPos[2])
IniWrite($ini, "Settings", "h", $WinPos[3])
Exit
EndFunc
Gibt es eine Möglichkeit, unter AutoIt eine Ordnerstruktur bzw. eine Datei zu kopieren und die Quell-Zugriffsberechtigung (ACL, AccessControlList) mit zu übernehmen ?
Oder nach dem FileCopy die Berechtigung nachträglich anzupassen ?
Da es aber einige 1000 Dateien betreffen würde, kommt eigentlich eine Aufruf eines externen CMDLine-Tools nicht in Frage....
Hat jemand eine andere Lösung (Win API, Win DLL) ? Nur schnell sollte sie sein !
Danke
micha_he
Ich habe mir das nun auch mal angesehen. Ein eindeutige Zuordnung konnte ich auch nicht finden. Aber ggf. werden nicht alle Rückgabeparameter der "NetAPI32.dll-NetFileEnum"-Funktion ausgenutzt.
Meiner Meinung nach, müsste doch die "geöffnete Datei" zu einer "Connection" zwischen dem Server und dem Arbeitsplatz gehören !
Aber leider kann ich da auch nicht weiterhelfen...
Hat jemand eine Idee, wie ich mit der .NET-Funktion "IO.FileSystemWatcher", auf Änderungen in einem lokalen Ordner reagieren kann ?
Wie wäre es mit einem (allgemein laufenden) Beispiel ?
Ich hab nur eine Idee, weis aber nicht ob es realisierbar ist:
1. Run EXE mit @SW_HIDE (dasmit sieh man es nicht)
2. Irgendwie regelmäßig einen Snapshot des Fensters anfertigen und in ein Autoit-Objekt einfügen. ( ? PrintWindow aus "user32")
Aber ist halt nur eine Idee....
Hast du mit einer MsgBox vor dem "FileSaveDialog" einmal geprüft, ob in den Variablen "$SaveFolder" & "$Woche_Hefte" auch gültige Daten sind ?
Ggf. führt die Funktion zum Fehler, weil eine der beiden Variablen = NULL ist.
edit: Ich sehe gerade, Du sagst es kommt zum Fehler in der "Word.au3". Wenn dies natürlich bei der 1. Funktion "_WordMacroRun" passiert, dann komm Dein Script nie zur MsgBox, weil das Script beim ersten Aufruf schon beendet wird.
Und um zu sehen ob der Aufruf "_WordMacroRun" richtig ist, müsstest Du schon etwas mehr wie 5 Zeilen posten. Aus den Angaben sieh man nicht, was in den Variablen steht. Ich würde an deiner Stelle, vor den Funktionen die Variabelen mit gültigen Daten füllen und wenn es dann immer noch nicht läuft, dann kannst Du den Ausschnitt (incl. der Variablen) zum Testen hier einstellen, so das das Script dann auch bei uns laufen müsste.
Meine Lösung:
#include <array.au3>
Dim $out
Dim $pid
$pid = Run('"' & @ComSpec & '" /c subst','',@SW_HIDE,6)
While 1
If StdOutRead($pid,0,True) <> 0 Then
$out &= StdoutRead($pid)
Endif
If @error Then ExitLoop
Sleep(100)
WEnd
$subst_array = StringSplit($Out,@CRLF,1)
_ArrayDelete($subst_array,UBound($subst_array)-1)
$subst_array[0] = UBound($subst_array)-1
For $i = 1 To $subst_array[0]
RunWait('"' & @ComSpec & '" /c subst ' & StringLeft($subst_array[$i],2) & ' /D','',@SW_HIDE)
Next
Entweder
$duf = 1
$dav = 8
$dov = 4
$dif = 5
$error = "error"
$Text = "3131231"
ShellExecute('batch.cmd', $duf & ' ' & $dov & ' ' & $dav & ' "' & $error & '" "' & $Text & '"')
oder auch
$duf = 1
$dav = 8
$dov = 4
$dif = 5
$error = "error"
$Text = "3131231"
ShellExecute("batch.cmd", $duf & " " & $dov & " " & $dav & " " & Chr(34) & $error & Chr(34) & " " & Chr(34) & $Text & Chr(34))
Das mit dem $Location ist meiner Meinung nach einfach: Es muss GUICtrlRead und nicht GUICtrlGetState bei einem Input-Feld in Zeile 35 heißen.
Zu dem $GUI_CHECKED-Problem, kann ich zur Zeit auch nichts sagen, in einem meiner Scripte habe ich gerade nachgesehen und dort funktioniert es nach anscheinend gleicher Methode. Jedenfalls sehe ich erstmal keinen Unterschied.
Edit: Hab doch den Unterschied: Muss GUICtrlRead statt GUICtrlGetState heißen. Aber die folgenden Zeilen müssen natürlich unter "Case $Install" und nicht unter "Case $Verkn". Sonst legt er den Link nicht bei der Installation, sondern beim wählen der Option an. Unter "Case $Verkn" muss eigentlich nix !
Hier die Zeilen:
If GUICtrlRead($Verkn) = $GUI_CHECKED Then
FileCreateShortcut($test & "\main.au3",@DesktopDir & "\test.lnk")
EndIf
Insgesamt sollte es etwa so aussehen:
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
Global $i = 0
[/autoit] [autoit][/autoit] [autoit]#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Window = GUICreate("test Programm", 476, 66, @DesktopHeight / 2.5, @DesktopWidth / 4)
$Location = GUICtrlCreateInput("C:\Programme\test", 8, 16, 257, 21)
$Locate = GUICtrlCreateButton("Installationspfad", 272, 16, 97, 25, 0)
$Install = GUICtrlCreateButton("Installieren", 376, 16, 89, 25, 0)
$Verkn = GuiCtrlCreateCheckbox("Verknüpfung auf dem Desktop erstellen (empfohlen)",8,40,290,30)
$Progress1 = GuiCtrlCreateProgress(335, 50, 127, 13)
GuiCtrlSetData(-1, $i)
GUICtrlSetState($Verkn, $GUI_CHECKED)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $Locate
$var = FileSelectFolder("Bitte Installationspfad angeben", "", -1, @ProgramFilesDir & "\test")
GUICtrlSetData($Location, $var)
Case $Verkn
; hier passiert nix, der Haken geht automatisch
Case $Install
DirCreate(GUICtrlRead($Location))
DirCopy(@ScriptDir, GUICtrlRead($Location),1)
FileCopy(@ScriptDir & "\" & "Addons" & "\" & "test.exe", @SystemDir, 1)
$wait = 20
GUICtrlSetData($progress1, $i)
Sleep($wait)
For $i = 0 To 100
$MSG = GUIGetMsg()
GUICtrlSetData($PROGRESS1, $i)
sleep($wait)
Next
$confirm = MsgBox(0, "Installation abgeschlossen", "Die Installation ist fertiggestellt")
If $confirm = 1 Then ; Checked "ok" !! Msgbox mit Ok und auf Ja abfragen haut nicht hin !!
; Hier wird der Link erzeugt, wenn angewählt
$test = GUICtrlRead($Location)
If GUICtrlRead($Verkn) = $GUI_CHECKED Then
FileCreateShortcut($test & "\main.au3",@DesktopDir & "\test.lnk")
EndIf
EndIf
Exit
EndSwitch
WEnd
Ich würde das "vom Prinzip" so aufbauen:
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Downloadbutton
$files = FileOpen($SaveFileList,0)
If $files = -1 Then
MsgBox(0, "Fehler", "Konfig-Datei kann nicht geöffnet werden.")
Exit
EndIf
While 1
$file=FileReadLine($files)
If @error = -1 Then ExitLoop ; letzte erreicht
; z.B. Unterschied ermitteln
If StringLeft(StringRight($file,6),2) = @MON Then
; Fragen ob Downloaden
; wenn 'ja' Download-Funktion starten
EndIf
Wend
FileClose($files)
EndSwitch
WEnd
Der Fehler liegt an einem fehlenden BackSlash vorm Ziel-Link, da das Macro "@DesktopDir" keinen abschließenden "\" mitbringt !
Es muss so lauten:
FileCreateShortcut($var, @DesktopDir & "\Verknüpfung.lnk")
[/autoit]Ich habe zwar kaum was verstanden, aber ich wenn ich Dich richtig verstanden habe, möchtest Du folgendes (?)
Case $msg = $button_itunes $message = "Search."
[/autoit] [autoit][/autoit] [autoit]$var = FileOpenDialog($message, @WindowsDir & "\", "Images (*.jpg;*.bmp)", 1 + 4 )
[/autoit] [autoit][/autoit] [autoit]If @error Then
; nix tun
Else
$var = StringReplace($var, "|", @CRLF)
MsgBox(4096,"","->" & $var)
IniWrite("C:\Dokumente und Einstellungen\1\Desktop\test.ini","test1","Var",$var) ; hier einfach den Wert der in der Sektion "test1" unter "Var" abgelegt werden soll
EndIf
wieder einlesen geht dann etwa so:
$var = IniRead("C:\Dokumente und Einstellungen\1\Desktop\test.ini","test1","Var")
[/autoit]Beides ist aber sehr klar verständlich in der AutoIt-Hilfe nachzulesen !
Wäre natürlich schön gewesen, wenn Du geschrieben hättest was nicht geht, bzw. was falsch ausgeführt wird.
Um aber die Probleme mit Leerzeichen zu umgehen gäbe es z.B. diese zwei Möglichkeiten:
$Save = FileSaveDialog ( "Datei speichern unter", @MyDocumentsDir, "Windows-Image (*.wim)", 3)
[/autoit] [autoit][/autoit] [autoit]If @error Then
MsgBox(4096,"","Save cancelled.")
Else
MsgBox(4096,"","You chose " & $Save)
EndIf
run(Chr(34) & @ScriptDir & "\return.cmd" & Chr(34) & " " & Chr(34) & $Save & Chr(34)) ; Chr(34) = "
[/autoit]oder...
$Save = FileSaveDialog ( "Datei speichern unter", @MyDocumentsDir, "Windows-Image (*.wim)", 3)
[/autoit] [autoit][/autoit] [autoit]If @error Then
MsgBox(4096,"","Save cancelled.")
Else
MsgBox(4096,"","You chose " & $Save)
EndIf
run('"' & @ScriptDir & '\return.cmd" "' & $Save & '"')
[/autoit]Beide Möglichkeiten sind aber ungetestet, da ich zur Zeit unter Linux schreibe !
Ich denke ein bischen Grips anstrengen bei der Laufwerksauswahl ist net falsch. Wer des Tool kennt kann sich ja denken das er nur ein Laufwerk auswählen soll .
.
Ich liebe es aber, wenn ein Script 99,9% ist. Und wenn ich das "Autorun.inf-Erzeugungsscript" benutze und am Anfang einen Unterordner eines Laufwerks öffne, wird dieser in die Variable gelesen und anschließen für die nächsten Filedialoge benutzt. Der User steht also bei allen drei Datei-Auswahlen in dem vorher gewählen Laufwerks-Unterordner.
Für die Funktion tut das ja keinen Abbruch, weil ich sowieso nur die linken 2 Zeichen verwende, nur schön ist es nicht. Der User muss halt immer wieder die Ordner rückwärts klicken.
Das mit dem ArraySerach und ArrayDelete muss ich mir nochmal näher ansehen, wenn ich etwas mehr Zeit habe.
micha_he
Ich habe das Tool zum Erzeugen der "Autorun.inf" um einige Fehlerabfragen erweitert. Das einzige was ich noch nicht gefunden habe ist eine Möglichkeit, das der User beim ersten Dialog nur die Laufwerke und keine Unterordner wählen kann.
Hier die erweiterte Version:
Local $Var,$Var1,$Var2,$var3
Local $Icon,$Open,$Close
$var = FileSelectFolder("Wechseldatenträger für Autorun.inf auswählen ", "")
If $var <> "" Then
$var1 = FileOpenDialog("Autorun icon auswählen ", $Var, "Icons (*.ico)", 1 + 4 )
$var2 = FileOpenDialog("Autorun open auswählen ", $Var, "Ausführbares (*.exe;*.bat;*.cmd)", 1 + 4 )
$var3 = FileOpenDialog("Autorun close auswählen ", $Var, "Ausführbares (*.exe;*.bat;*.cmd)", 1 + 4 )
If $var1 <> "" Then
$Icon = Stringsplit ($var1,"\")
IniWrite(StringLeft($var,2) & "\autorun.inf", "autorun", "icon", $Icon[2])
Else
IniDelete(StringLeft($var,2) & "\autorun.inf", "autorun", "icon")
EndIf
If $var2 <> "" Then
$Open = Stringsplit ($var2,"\")
IniWrite(StringLeft($var,2) & "\autorun.inf", "autorun" , "open", $Open[2])
Else
IniDelete(StringLeft($var,2) & "\autorun.inf", "autorun" , "open")
EndIf
If $var3 <> "" Then
$Close = Stringsplit ($var3,"\")
IniWrite(StringLeft($var,2) & "\autorun.inf", "autorun", "close", $Close[2])
Else
IniDelete(StringLeft($var,2) & "\autorun.inf", "autorun", "close")
EndIf
EndIf