Desktop Verknüpfungen verteilen

  • 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
    [autoit]


    #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 ****

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <file.au3>
    #include <TreeViewConstants.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <ButtonConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('TrayIconHide', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Computer_OK[1],$computer_name[1]
    Global $Datei

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $computer_list = "C:\WINDOWS\Temp\computer.txt"
    ;$computer_list = "computer.txt"

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;Dquery Starten um Computerliste der Domaine zu erstellen
    RunWait (@ComSpec & " /c " & "C:\WINDOWS\system32\dsquery.exe computer > " & $computer_list, "", @SW_HIDE)

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;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)

    [/autoit] [autoit][/autoit] [autoit]

    $tree = GuiCtrlCreateTreeView(10, 10, 280, 280, $TVS_CHECKBOXES)

    [/autoit] [autoit][/autoit] [autoit]

    $SelAll_Item_On = 0
    $SelAll_Item = GUICtrlCreateTreeViewItem("Alle makieren", $tree)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Computerliste in Array Schreiben
    For $x = 1 to $aRecords[0]

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ;GUI erstellen
    $GUI_OK = GuiCtrlCreateButton("Verteilen", 10, 310, 100, 30)
    $GUI_Loeschen = GuiCtrlCreateButton("Löschen", 120, 310, 100, 30)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Case $GUI_OK
    Kopieren()
    ContinueLoop

    Case $GUI_Loeschen
    Loeschen()
    ContinueLoop

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Kopieren()
    Do
    $ok = 0

    [/autoit] [autoit][/autoit] [autoit]

    $Datei = FileOpenDialog("", @DesktopDir, "Alle Dateien (*;*.lnk)", 1)
    $Datei = InputBox ("Datei","Bitte geben Sie eine Datei zum verteilen ein.", $Datei, "",300, 120)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Close()
    FileDelete($computer_list)
    Exit
    EndFunc

    [/autoit]

    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.

    2 Mal editiert, zuletzt von Holli (23. März 2009 um 15:00)

  • Ist unter Umständen bei den "Server Support Tools" bei...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • So, es gab ein kleines Update.
    Es werden nun die Computer Alphabetisch sortiert und man kann alle gleichzeitig makieren.