ODBC Datasourcen löschen, die einen bestimmten Treiber verwenden.

  • Hallo zusammen

    Ich muss ODBC Datasoucen löschen, die einen bestimmten Treiber verwenden.

    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\Driver1

    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\Driver2

    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\Driver(n)

    Ein Treibereintrag sieht so aus:

    REGEDIT4


    DH in der Theorie müsste ich alle Datasourcen, die den Treiber

    "Driver"="C:\\WINDOWS\\system32\\mydriver.dll"

    enthalten löschen. Hilft mir jemand auf die Sprünge, wie sich das umsetzen lässt. ;(

    Ich hab zwar hier sogar was in die Richtung gefunden, aber es überfordert meinen Skill: ODBC-Generator

    Danke euch,

    Surfy

    Einmal editiert, zuletzt von Surfy (10. Oktober 2011 um 18:59)

  • [autoit]

    #RequireAdmin

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

    Dim $s_dsn_label
    Dim $s_dsn_driver_choice = "\sqlsrv32.dll" ; mssql
    ;~ Dim $s_dsn_driver_choice = "\msorcl32.dll" ; oracle

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

    Dim $s_Reg_Path = "HKEY_LOCAL_MACHINE"
    ;~ Dim $s_Reg_Path = "HKEY_CURRENT_USER"

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

    If @OSArch = "X86" Then
    $s_Reg_Key = $s_Reg_Path & "\SOFTWARE\"
    Else
    $s_Reg_Key = $s_Reg_Path & "\SOFTWARE\Wow6432Node\"
    EndIf

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

    _Read_DSN_Combo($s_dsn_driver_choice)
    If $s_dsn_label <> "" Then
    _Del_My_DSN($s_dsn_label)
    Else
    MsgBox(0,"","keine DSNs ermittelt.")
    EndIf

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

    ; Funktionen

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

    Func _Read_DSN_Combo($s_dsn_driver_choice) ; DSNs aus Registry ermitteln
    $s_dsn_label = ""
    For $i= 1 to 50
    If @error <> 0 then ExitLoop
    $s_dsn_name = RegEnumVal($s_Reg_Key & "ODBC\ODBC.INI\ODBC Data Sources", $i)
    $s_dsn_driver = RegRead($s_Reg_Key & "ODBC\ODBC.INI\" & $s_dsn_name,"Driver")
    If StringInStr($s_dsn_driver,$s_dsn_driver_choice) Then $s_dsn_label &= $s_dsn_name & "|"
    Next
    $s_dsn_label = StringTrimRight($s_dsn_label,1)
    Return $s_dsn_label
    EndFunc

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

    Func _Del_My_DSN($s_dsn_label)
    $a_DSN_Names = StringSplit($s_dsn_label,"|")
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(4145,"Achtung","Möchten sie folgende DSNs löschen?" & @CRLF & @CRLF & $s_dsn_label)
    Select
    Case $iMsgBoxAnswer = 1 ;OK
    For $i_dsn_cnt = 1 To UBound($a_DSN_Names,1) -1
    MsgBox(0,"",$a_DSN_Names[$i_dsn_cnt] & " wird gelöscht.")
    RegDelete($s_Reg_Key & "ODBC\ODBC.INI\" & $a_DSN_Names[$i_dsn_cnt])
    RegDelete($s_Reg_Key & "ODBC\ODBC.INI\ODBC Data Sources", $a_DSN_Names[$i_dsn_cnt])
    Next
    Case Else
    MsgBox(0,"","Es wurde nichts gelöscht.")
    Exit
    EndSelect
    EndFunc

    [/autoit]

    so mal etwas entschlackt dann kannst Du Dir es anpassen wie du es brauchst.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    2 Mal editiert, zuletzt von Dietmar (10. Oktober 2011 um 23:47)

  • Herzlichen Dank, so gesäubert kann ich auch etwas damit anfangen ! :)

    Das einzige was nicht geht, ist, dass wenn der ODBC Treiber schon weg ist, die Datasourcen nicht mehr gelöscht werden.

    Kommt zwar nicht so oft vor, aber dass würde ich auch gerne abdecken ;(

    Was ich da drehen müsste, ist mir allerdings schleierhaft 8|

    Einmal editiert, zuletzt von Surfy (11. Oktober 2011 um 08:57)

  • Zitat

    Das einzige was nicht geht, ist, dass wenn der ODBC Treiber schon weg ist,

    Wie weg, deinstalliert oder der Key existiert nicht mehr?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Der Treiber selber ist in dem Fall schon weg (nicht mehr unter Drivers ersichtlich), aber der Reghive steht noch:



    Ohne treiber macht das Script aber nichts mehr..

  • [autoit]

    If StringInStr($s_dsn_driver,$s_dsn_driver_choice)

    [/autoit]


    klar du wolltest ja anhand eines Treibers filtern :)

    evtl. mal testen mit

    [autoit]

    If StringInStr($s_dsn_driver,$s_dsn_driver_choice) Or $s_dsn_driver = "" Then $s_dsn_label &= $s_dsn_name & "|"

    [/autoit]

    Also mal Zeile 32 tauschen und vorsichtig testen. :whistling:

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (11. Oktober 2011 um 09:34)

  • Hmm eigentlich werden dorch nur die pipesepariert die DSN Namen aneinandergtackert welche
    a.) mit dem Treiber
    b.) mit keinen Treiber bestückt sind

    Und die Liste lösche ich dann, seltsam, mal in ner VM ausprobieren.
    Melde mich gleich mal wieder.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Wie ich ODBC Datasourcen lösche, die keinen Treiber mehr haben (leichen) - ist mir leider noch immer nicht klar.

    Bei meinen Tests lösche ich dann entweder zuviel, oder gar nichts :(