Guten Morgen
Ich habe mir ein kleines Programm geschrieben womit ich Desktopverknüpfungen in einer Domäne auf den Desktops verteilen bzw. löschen kann.
Eventuell hat ja noch jemand verwendung hierfür.
Was noch kommen soll, wenn ich denn Zeit habe:- eine Alphabetische sortierung
- eine Job Control
(Das man Computer auf denen das Verteilen fehlgeschlagen werden ein einer Liste gespeichert werden und nachher erneute versucht werden können)
- evtl. das auslesen des AD ohne dsquery.exe
Vielleicht hat ja noch jemand von euch ein paar Vorschläge und Optimierungsvorschläge.
Hier erstmal der Code.
Spoiler anzeigen
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=ICONS\computers.ico
#AutoIt3Wrapper_outfile=C:\verteilen.exe
#AutoIt3Wrapper_Res_Fileversion=0.2.1.7
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=Thomas Hollenbeck
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <file.au3>
#include <TreeViewConstants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
Opt('TrayIconHide', 1)
[/autoit] [autoit][/autoit] [autoit]Dim $Computer_OK[1],$computer_name[1]
Global $Datei
$computer_list = "C:\WINDOWS\Temp\computer.txt"
;$computer_list = "computer.txt"
;Prüfen ob dsquery.exe vorhanden ist.
If FileExists ("C:\WINDOWS\system32\dsquery.exe") = 0 Then
MsgBox (4096,"Error","'dsquery.exe' ist nicht vorhanden! Bitte installieren sie es.")
Exit 1
EndIf
;Dquery Starten um Computerliste der Domaine zu erstellen
RunWait (@ComSpec & " /c " & "C:\WINDOWS\system32\dsquery.exe computer > " & $computer_list, "", @SW_HIDE)
;Prüfen ob Liste vorhanden ist
Dim $aRecords
If Not _FileReadToArray($computer_list,$aRecords) Then
MsgBox(4096,"Error", "Fehler beim laden der Computerliste!")
Exit 1
EndIf
;GUI mit Auswahl der Computer erstellen
;Fenster bleibt solange geöffnet bis das Programm mit 'X' beendet wird,
;auch wenn eine Funktion gestartet wurde.
GUICreate("Computerauswahl", 300, 350)
$tree = GuiCtrlCreateTreeView(10, 10, 280, 280, $TVS_CHECKBOXES)
[/autoit] [autoit][/autoit] [autoit]$SelAll_Item_On = 0
$SelAll_Item = GUICtrlCreateTreeViewItem("Alle makieren", $tree)
;Computerliste in Array Schreiben
For $x = 1 to $aRecords[0]
ReDim $computer_name[UBound($computer_name)+1]
[/autoit] [autoit][/autoit] [autoit]$aRecords1 = StringSplit($aRecords[$x], ',')
$computer = StringSplit($aRecords1[1], '=')
$computer_name[$x] = $computer[2]
Next
$computer_name[0] = $x-1
[/autoit] [autoit][/autoit] [autoit]_ArraySort ($computer_name)
[/autoit] [autoit][/autoit] [autoit];Sortierte Computerliste in GUI schreiben
For $x = 1 to $computer_name[0]
ReDim $Computer_OK[UBound($Computer_OK)+1]
$Computer_OK[$x] = GuiCtrlCreateTreeViewItem($computer_name[$x], $tree)
Next
;GUI erstellen
$GUI_OK = GuiCtrlCreateButton("Verteilen", 10, 310, 100, 30)
$GUI_Loeschen = GuiCtrlCreateButton("Löschen", 120, 310, 100, 30)
GuiSetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$GUI_Msg = GUIGetMsg()
Switch $GUI_Msg
Case $GUI_EVENT_CLOSE
Close()
ContinueLoop
Case $SelAll_Item
SelectAll()
ContinueLoop
Case $GUI_OK
Kopieren()
ContinueLoop
Case $GUI_Loeschen
Loeschen()
ContinueLoop
EndSwitch
WEnd
Func SelectAll()
If $SelAll_Item_On = 1 Then
For $x = 1 to $computer_name[0]
GUICtrlSetState ($Computer_OK[$x], 0)
Next
$SelAll_Item_On = 0
Else
For $x = 1 to $computer_name[0]
GUICtrlSetState ($Computer_OK[$x], 1)
Next
$SelAll_Item_On = 1
EndIf
EndFunc
Func Kopieren()
Do
$ok = 0
$Datei = FileOpenDialog("", @DesktopDir, "Alle Dateien (*;*.lnk)", 1)
$Datei = InputBox ("Datei","Bitte geben Sie eine Datei zum verteilen ein.", $Datei, "",300, 120)
If @error = 0 Then
If StringRegExp ($Datei, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))") = 0 Then
MsgBox (16, "Fehler", "Fehlerhafte Pfadeingabe!")
Else
If FileExists ($Datei) = 0 Then
MsgBox (16, "Fehler", "Die angegebene Datei wurde nicht gefunden")
Else
$ok = 1
EndIf
EndIf
Else
ExitLoop
EndIf
Until $ok = 1
$y = 1
If $ok = 1 Then
Do
If BitAND(GUICtrlRead($Computer_OK[$y]), $GUI_CHECKED) Then
Ping($computer_name[$y],250)
If @error = 0 Then
If FileCopy($Datei, "\\" & $computer_name[$y] & "\c$\Dokumente und Einstellungen\All Users\Desktop\", 1) = 0 Then
MsgBox(16, "Fehler", "Konnte Datei auf " & $computer_name[$y] & " nicht kopieren!")
EndIf
Else
MsgBox(16, "Offline", $computer_name[$y] & " ist offline")
EndIf
EndIf
If $y = $computer_name[0] Then
MsgBox (64, "Abgeschlossen", "Das Verteilen der Datei '" & $Datei & "' abgeschlossen.")
ExitLoop
EndIf
$y = $y + 1
Until $computer_name[$y] = ""
EndIf
EndFunc
Func Loeschen()
$Datei = ".lnk"
Do
$ok = 0
$Datei = InputBox ("Datei","Bitte geben Sie eine Datei zum verteilen ein.", $Datei, "",300, 120)
If @error = 0 Then
;If StringRegExp ($Datei, "((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))") = 0 Then
; MsgBox (16, "Fehler", "Fehlerhafte Eingabe!")
;Else
$ok = 1
;EndIf
Else
ExitLoop
EndIf
Until $ok = 1
$y = 1
If $ok = 1 Then
Do
If BitAND(GUICtrlRead($Computer_OK[$y]), $GUI_CHECKED) Then
Ping($computer_name[$y],250)
If @error = 0 Then
If FileDelete("\\" & $computer_name[$y] & "\c$\Dokumente und Einstellungen\All Users\Desktop\" & $Datei) = 0 Then
MsgBox(16, "Fehler", "Konnte Datei auf " & $computer_name[$y] & " nicht gelöscht werden!")
EndIf
Else
MsgBox(16, "Offline", $computer_name[$y] & " ist offline")
EndIf
EndIf
If $y = $computer_name[0] Then
MsgBox (64, "Abgeschlossen", "Das Löschen der Datei '" & $Datei & "' ist abgeschlossen.")
ExitLoop
EndIf
$y = $y + 1
Until $computer_name[$y] = ""
EndIf
EndFunc
Func Close()
FileDelete($computer_list)
Exit
EndFunc
Dieser Script benötigt das Tool dsquerx.exe
Zu finden ist es im Windows Server 2003 Administration Tools Pack
unter http://www.microsoft.com/downloads/details.aspx?FamilyID=c16ae515-c8f4-47ef-a1e4-a8dcbacff8e3&displaylang=en
Viel spass damit.