1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. ahe

Beiträge von ahe

  • Eine laufende JAVA Anwendung erkennen

    • ahe
    • 20. April 2010 um 15:15

    Hallo,

    ich muss eine JAVA Applikation installieren (FreeMind), dazu darf aber FreeMind nicht gestartet sein. Es muss also vor der Installation geprüft werden, ob die Anwendung noch läuft und dann eine Meldung generiert werden diese durch den Anwender zu schließen.

    Das Problem ist jetzt, dass man im Taskmanager keine FreeMind.exe findet, sondern nur JAVAW.EXE. Diese EXE kann aber auch durch eine weitere JAVA Applikation gestartet worden sein, d. h. es kann mehrere gestartete JAVAW.EXE geben.

    Mit Hilfe des ProcessExplorer von Sysinternals kann man die Parameter sehen. Für FreeMind steht da z. B.:
    "C:\Program Files\Java\jre6\bin\javaw.exe" -jar "C:\Program Files\FreeMind\lib\freemind.jar"

    Mit Hilfe von

    [autoit]

    $pid = WinGetProcess("[CLASS:SunAwtFrame]")

    [/autoit]


    bekomme ich die PID von einem JAVA Prozess, aber nicht von Allen und auch sonst keine Infos.

    Mit Hilfe von

    [autoit]


    $list = ProcessList("javaw.exe")
    for $i = 1 to $list[0][0]
    MsgBox(0,"PIDs", $list[$i][1] & " " & $list[$i][0])
    next

    [/autoit]


    kann ich mir die Prozesse mit ihren PIDs anschauen, erhalte aber auch weiter keine Infos.

    Mit Hilfe von

    [autoit]


    WinGetTitle("[CLASS:SunAwtFrame]")

    [/autoit]


    erhalte ich den kompletten Titeltext einer JAVA Anwendung, jedoch immer nur den Ersten (oder Letzten?) gestarteten... nicht aber Alle.

    Der folgende Code findet Freemind, allerdings so oft, wie die Schleife durchlaufen wird. (Anzahl von gestarteten JAVAW.EXE) und nicht nur so oft, wie Freemind gestartet wurde...

    [autoit]

    $list = ProcessList("javaw.exe") ; Get the number and a list of JAVA processes
    for $i = 1 to $list[0][0]
    $code = StringInStr(WinGetTitle("[CLASS:SunAwtFrame]"), "Freemind")
    if $code <> 0 Then ; check if window title of the process contain the searched JAVA application
    MsgBox(0, "freemind", WinGetTitle("[CLASS:SunAwtFrame]") & " is in use")
    EndIf
    Next

    [/autoit]

    Mit Hilfe von WinList kann ich mir alle geöffneten Fenster mit Freemind-Inhalt anzeigen lassen (also auch eine Textdatei mit dem Titel Freemind...):

    [autoit]

    $hwnd = WinList()
    For $i = 1 to $hwnd[0][0]
    If StringInStr($hwnd[$i][0], "Freemind") > 0 Then
    MsgBox(0, "Titel", $hwnd[$i][0])
    EndIf
    Next

    [/autoit]

    Es gelingt mir jedoch nicht, den Bezug über den Titel zur korrekten PID herzustellen, oder ich finde nur die richtige Funktion nicht...

    Während des Schreibens habe ich einen Workaround geschrieben... :)

    Die folgenden Zeilen scheinen zu funktionieren, doch wäre es mir lieber, ich könnte auf irgendeine Art und Weise die Paramter von JAVAW.EXE ebenso auslesen, wie es der ProcessExplorer macht. Vielleicht habt ihr ja noch eine Idee...:

    [autoit]

    $s_DisplayName = "FreeMind"

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

    ; List just javaw.exe processes
    $list = ProcessList("javaw.exe")
    for $i = 1 to $list[0][0]
    $pid = WinGetProcess("[CLASS:SunAwtFrame]")
    MsgBox(4096, "PIDs", "PID von WinGetProcess ist: " & $pid & @CRLF & "PID von ProcessList ist: " & $list[$i][1])
    if $pid == $list[$i][1] Then
    While 1
    if StringInStr(WinGetTitle("[CLASS:SunAwtFrame]"), "FreeMind") Then
    MsgBox(4096, "freemind", "[CLASS:SunAwtFrame]" & " zugeh. PID: " & $pid)
    $response = MsgBox(32 + 4096, "Accept please...", $s_DisplayName & " is in use." & @CRLF & "Please close " & $s_DisplayName & " and click on OK to continue installation.")
    Select
    Case $response = 1
    MsgBox(0,"msg","User select to check again.")
    Case Else
    MsgBox(0,"msg","Response is not managed.")
    Exit 1000
    EndSelect
    Else
    MsgBox(0,"msg","Application is not longer running.")
    ExitLoop
    EndIf
    WEnd
    EndIf
    Next

    [/autoit]

    (AutoIT 3.3.6.0, Windows Vista 32, Windows XP 32)

    mfg
    Axel

  • Ermitteln der eingerichteten DNS-Server, des Adapters und der IP-Adresse eines Servers, ohne WMI...

    • ahe
    • 5. Februar 2010 um 11:09

    Hallo,

    kaum ist WMI auf dem W2K eingeschaltet, schon funktioniert es.

    Jetzt muss ich nur noch die Server verartzen, die ein Teaming der Netzwerkkarten eingerichtet haben.

    mfg
    Axel

    P.S.: die WMI lose Lösung schaue ich mir dennoch noch genauer an...

  • Softwareverteilung Hephaistos [RELEASE]

    • ahe
    • 5. Februar 2010 um 00:17

    Hallo Chip,

    sieht interessant aus und steckt wohl auch eine Menge Arbeit 'drin.

    Eine kleine Anmerkung hätte ich da noch...
    Warum verwendest Du in der run.exe und der client.exe nicht die Umgebungsvariable bzw. das Makro @ProgramFilesDir?
    Gleiches gilt für die Batch, dort könntest Du die Umgebungsvariable %ALLUSERSPROFILE% verwenden.

    und ein paar Fragen:
    In diesem Thread Softwareverteilung Hephaistos hast Du einen Screenshot gespeichert, dort sieht es so aus, als ob für einen Rechnerpool die Pakete zum Installieren markiert sind.

    Wie bestimmst Du die Reihenfolge der Installationen?
    Hast Du Paketabhängigkeiten in den Paketen selbst realisiert oder über Regeln in der GUI?
    Wie überprüfst Du, ob die Software auch tatsächlich installiert wurde? Inventarscan nach der Installation? Landen die Daten in der DB vom Server?

    mfg
    Axel

  • Ermitteln der eingerichteten DNS-Server, des Adapters und der IP-Adresse eines Servers, ohne WMI...

    • ahe
    • 4. Februar 2010 um 23:39

    Danke Bitboy, danke Der_Doc,

    probier' ich morgen aus. Habe hier keinen W2K-Server... :)

    Bitboy: Unter Vista funktioniert das Skript ohne Änderung nicht, da die Registrypfade nicht die Einträge enthalten, wie erwartet:
    Diesen Eintrag gibt es auf meinem Vista-Rechner nicht... (schaue ich mir aber morgen noch einmal etwas genauer an...)

    Code
    HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip
    [autoit]


    #include <Array.au3>
    $aAdapter = _GetAllNetAdapterInfo()
    _ArrayDisplay($aAdapter)
    . . .

    [/autoit]

    Ausgabe des obigen codes, s. angehängtes Bild.


    Ich habe eben gelesen, dass WMI bereits in W2K integriert war, es muss nur aktiviert werden. Bei NT 4.0 und W95 mußte man es erst installieren.
    Morgen frage ich den zuständigen Admin, ob es Absicht war, WMI nicht zu aktivieren... vielleicht ist damit dann das Problem ohnehin gefixt (hoffe ich 'mal...)

    mfg
    Axel

    Dateien

    ArrayListView.bmp 798,43 kB – 443 Downloads
  • Ermitteln der eingerichteten DNS-Server, des Adapters und der IP-Adresse eines Servers, ohne WMI...

    • ahe
    • 4. Februar 2010 um 18:52

    Danke für die Antwort...;(

    ok, harter Tobak... :)

    Du erstellst eine XML Datei/Ausgabe mit diversen Info's, die der Ausgabe von ipconfig /all ähneln, darüber aber hinausgehen. Nur die DNS-Einträge kann ich nicht finden...

    Wenn ich es jetzt richtig verstanden habe, muss ich "nur" die geeignete Funktion in der IPHLPAPI.DLL finden, die mir meine DNS-Server zurückgibt.

    Ich habe jetzt versucht mit dem DependencyWalker die Funktionen der IPHLPAPI.DLL anzuschauen und die Verweise auf der MS Seite zu verstehen, konnte jedoch bislang nix zu den DNS Settings finden.
    http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

    Beim Regkey $NETWORK_REG_KEY bin ich mir nicht sicher, ob alle Unterkeys und Einträge vorhanden sind, speziell z. B. MediaSubType ist nicht unter W2K vrohanden(zumindest auf dem Server, auf dem ich nachgesehen habe)

    Aber mir reicht es ja schon, wenn ich die DNS-Server der Adapter hätte...

    Das wird dann wohl ein "Such"-Abend...

    mfg
    Axel

  • Ermitteln der eingerichteten DNS-Server, des Adapters und der IP-Adresse eines Servers, ohne WMI...

    • ahe
    • 4. Februar 2010 um 17:41

    Hallo,

    ich habe da ein Problem die eingetragenen DNS-Server, das Adapter und die IP-Adresse eines Servers (oder auch Clients) auszulesen.
    Diese Daten sollen dann, neben noch ein paar anderen Info's (ping results...) als einfacher auslebarer Wert in die Registry geschrieben werden.

    Nun funktioniert meine Lösung eigentlich Das Auslesen der Werte klappt, der Ping klappt und das Schreiben in die Registry auch.
    Aber leider nur unter Windows XP, Vista, W7 und W2K3 (meistens), weil ich dort WMI nutzen kann. Es muss aber auch auf (bitte nicht lachen!!!) Windows 2000 Servern 8| funktionieren und dort ist mit WMI nix... ?(

    Nun kann ich die IP-Adresse(n) des Rechners ermitteln (solange die OS-Sprache mitspielt)
    Beispiel für einen deutschen Client: ("IP-Adresse" anstelle von "IP Address")

    Code
    #include <Constants.au3>
    
    
    Local $PID = Run(@ComSpec & ' /c ipconfig /all|find "IP-Adresse"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $line
    While 1
    	$line &= StdoutRead($PID)
    	If @error Then ExitLoop
    Wend
    MsgBox(0, "IP-Adresse:", $line)

    Auch die erste DNS-Server-Adresse bekomme ich noch heraus,
    Beispiel für einen deutschen Client: ("DNS-Server" anstelle von "DNS Server")

    Code
    #include <Constants.au3>
    Local $PID = Run(@ComSpec & ' /c ipconfig /all|find "DNS-Server"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $line
    While 1
    	$line &= StdoutRead($PID)
    	If @error Then ExitLoop
    Wend
    MsgBox(0, "DNS-Server:", $line)

    ABER:
    Den zweiten DNS Server (oder Dritten?) den es ggfs. gibt (bei uns meistens), den bekomme ich nicht.

    Die Beschreibung/Description des Adapters bekomme ich auf die gleiche Art, wie die IP, allerdings empfinde ich das dann doch als etwas "anstrengend",
    zumal die Zuordnungen Adapter - IP-Adresse - DNS-Server so nicht mehr erkennbar sind.

    Also, Alles in einen Array, doch:

    • wie füllt man diesen Array am geschicktesten, die Ausgabe von z. B. IPCONFIG /ALL oder netsh... zeilenweise als Arrayelement? (kann man die Ausgabe überhaupt so umbiegen?)
    • wie geht man diesen Array dann durch? Schließlich sind die einzelnen Werte nicht immer vorhanden...die Positionen können verschoben sein

    Oder habt ihr vielleicht noch eine Idee, wie man das Problem lösen kann ohne WMI zu benutzen?

    mfg
    Axel

    (etwas gefrustet, weil eigentlich letzte Nacht schon fertig...)

  • Hilfe beim Skript zum Installieren von MS Office 2007

    • ahe
    • 6. Juli 2009 um 18:08

    Hier gibt es auch ein paar Info's:
    http://www.appdeploy.com/packages/detail.asp?id=860

    mfg
    Axel

  • Problem mit VBS Übersetzung in AutoIt

    • ahe
    • 28. Juni 2009 um 22:57

    Hallo,

    du könntest auch mittels einer Schleife den Uninstall-Zweig in der Registry nach dem Produkt durchsuchen lassen...

    Hier ist ein Beispiel: Apple QuickTime 7.5.5 (zugegebenermaßen ist der Code nicht sehr gut lesbar...)

    Der Einfachheit halber, kannst du aber auch diese Funktion testen, die ich inzwischen verwende (die Basis habe ich entweder hier oder im englischen Forum gefunden):

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Description: Uninstalls the version of a software identified by the DisplayName key in the registry. (Works only for MSI packages)
    ; Syntax; RemoveMSISoftware($s_Name)
    ; Parameters: $s_Name - The display name of the software to remove.
    ;===============================================================================

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

    Func _RemoveMSISoftware($s_Name)

    MsgBox(0,"Uninstallation message", "Check for old Version")
    $num = 0
    $fin = 0
    Do
    $num = $num + 1
    $key = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", $num)
    If @error <> 0 Then
    $fin = 1
    Else
    $displayname = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $key, "DisplayName")
    If StringInStr($displayname, $s_Name) Then
    $UninstallString = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $key, "UninstallString")
    $DisplayVersion = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $key, "DisplayVersion")
    MsgBox(0,"Uninstallation message", "Uninstall " & $displayname & " (" & $DisplayVersion & ")")
    $UninstallString = StringUpper($UninstallString)
    $UninstallString = StringReplace($UninstallString, "/I", "/X ") & " /qn ALLUSERS=1 REBOOT=ReallySuppress"
    $code = RunWait($UninstallString, $WorkDir, @SW_HIDE)
    Sleep(10000)
    If $code Then
    If $code = 3010 Then
    MsgBox(0,"Uninstallation message", "Successfull uninstallation, a reboot of the workstation is requested.")
    Else
    MsgBox(0,"Uninstallation message", "Error during uninstallation, the error code is:." & $code)
    SetError(4)
    Return;
    EndIf
    Else
    MsgBox(0,"Uninstallation message", "Successfull uninstallation.")
    EndIf

    ; now check if uninstall ok - uninstall key deleted and decrement instance number ($num)
    $displayname = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $key, "DisplayName")
    If $displayname = "" Then $num = $num - 1
    EndIf
    EndIf
    Until $fin
    EndFunc ;==>_RemoveMSISoftware

    [/autoit]

    mfg
    Axel

  • McAfee SDATxxxx.exe download Skript

    • ahe
    • 28. Juni 2009 um 22:24

    Danke :D

    Nun ein paar Fragen hätte ich schon...
    1.
    Ursprünglich wollte ich die meldungen nicht in einer Message Box ausgeben, sondern auf der Kommandozeile. Allerdings fände ich es auch schön, wenn die Anwendung erkennt, ob sie entweder von der Kommandozeile bzw. per AT-Job bzw. aus einer Batch heraus gestartet wird, oder aber per Doppelklick über die GUI...

    Wenn ich den Hinweis von Xeno allerdings richtig verstanden habe, habe ich nur die Wahl, entweder Kommandozeile, oder GUI...
    ( [ offen ] Statusausgaben in Kommandozeile plotten), das wäre schade...

    2.
    Ein wenig habe ich ja mit einfachen Parameteraufrufen begonnen, nur würde ich das ggfs. noch etwas ausweiten, wenn ich wüßte, ob der Weg den ich da gegangen bin sinnvoll ist, oder ob es vielleicht eine geschicktere Alternative gibt...

    3.
    Die "Abfrage-Struktur" fängt derzeit nicht den Wunsch ab, z. B. einen INI-Wert durch einen Kommandozeilen-Parameter zu überschreiben. D. h. sobald ein entsprechender Kommandozeilen-Parameter gesetzt wird, wird nicht der Wert aus der INI gelesen, sondern der, der als Parameter and der Kommandozeile angegeben wurde:
    Die folgende Zeile könnte den Pfad für die update.ini, der in der CONF_SDAT_UPD.ini ignorieren und einen eigenen nehmen

    Code
    -INI YES -UPDATE_INI_PATH=D:\nai\update.ini

    Da ich noch nicht so firm bin, die Übergabeparameter auszuwerten, habe ich bislang auf solche Dinge verzichtet...

    mfg
    Axel

  • McAfee SDATxxxx.exe download Skript

    • ahe
    • 28. Juni 2009 um 00:43

    Da habe ich wohl vergessen die Dateien anzuhängen...

    Die CONF_SDAT_UPD.ini.txt Datei muss nur entsprechend als CONF_SDAT_UPD.ini im ScriptDir abgespeichert werden...

    Axel

  • McAfee SDATxxxx.exe download Skript

    • ahe
    • 26. Juni 2009 um 16:02

    Hallo,

    ich habe da ein kleines Skript geschrieben, dass die aktuelle SDATxxxx.exe von der McAfee Seite herunterlädt.
    Ich denke da gibt es noch ordentlich Verbesserungsmöglichkeiten, z. B.

    • Code von Bugs befreien :)
    • hinzufügen weiterer Kommandozeilenparameter, damit eine INI nicht unbedingt nötig ist
    • Errorhandling
    • vernünftiges Logging
    • vollständig unbeaufsichtigter Modus, damit man es auch per Scheduler (oder AT-Job) laufen lasse kann
    • etc.

    Vielleicht kann es ja jemand hier gebrauchen...

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Description: Download of current SDATxxxx.exe files from McAfee page
    ; via HTTP (FTP is not allowed in some companies...)
    ;
    ; Author(s): ahe
    ; Version: 1.0.0.0
    ; Date: 26.06.2009
    ;
    ; Filename: McAfee_SDAT_Download.au3
    ; EXE name: McAfee_SDAT_Download.exe
    ;
    ;===============================================================================
    ; The script download the update.ini file from McAfee site, scan the entry for SDATxxxx.exe version
    ; and download the grabbed exe.
    ; In INI file CONF_SDAT_UPD.ini all specific pathes are stored, if McAfee changed something, you can
    ; change the entries too.
    ;===============================================================================
    ; Parameters from INI file:
    ; $update_site_url Path to update.ini on download page
    ; $sdat_url Base path to sdatxxxx.exe
    ; $update_ini_file Local store path to INI file
    ; $dest_sdat_path Local store path for sdatxxxx.exe

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

    $INI = @ScriptDir & "\CONF_SDAT_UPD.ini"

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

    $INIFILE= 'CONV_SDAT_UPD.INI - example:' & @CRLF & @CRLF
    $INIFILE= $INIFILE & '________________________________________________________________________________' & @CRLF
    $INIFILE= $INIFILE & '[SDATURL]'& @CRLF
    $INIFILE= $INIFILE & '; Path to update.ini on download page'& @CRLF
    $INIFILE= $INIFILE & 'UPDATE_INI_URL="http://download.nai.com/products/datfiles/4.x/nai/update.ini"' & @CRLF
    $INIFILE= $INIFILE & '; Base path to sdatxxxx.exe'& @CRLF
    $INIFILE= $INIFILE & 'SDAT_URL="http://download.nai.com/products/licensed/superdat/english/intel/"'
    $INIFILE= $INIFILE & '[SDATPATH]'& @CRLF
    $INIFILE= $INIFILE & '; Local store path to INI file'& @CRLF
    $INIFILE= $INIFILE & 'UPDATE_INI_PATH="c:\temp\nai\update.ini"'& @CRLF
    $INIFILE= $INIFILE & '; Local store path for sdatxxxx.exe'& @CRLF
    $INIFILE= $INIFILE & 'DEST_SDAT_PATH="c:\temp\nai"'& @CRLF
    $INIFILE= $INIFILE & '________________________________________________________________________________' & @CRLF

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

    $helpmsg = "Correct installation parameters:" & @CRLF
    $helpmsg = $helpmsg & @TAB & "No parameter and no ini config file!" & @TAB & "The embedded values are used... (s. switch -e or /e)" & @CRLF
    $helpmsg = $helpmsg & @TAB & "-INI YES " & @TAB & @TAB & "Use SDAT_UPD.ini in current directory to find the path to SDATxxxx.exe" & @CRLF
    $helpmsg = $helpmsg & @TAB & "-INI NO " & @TAB & @TAB & "Search SDATxxxx.exe in standard path" & @CRLF
    $helpmsg = $helpmsg & @TAB & "-PATH <path> " & @TAB & "Use the given path in the brackets <> to search SDATxxxx.exe" & @CRLF
    $helpmsg = $helpmsg & @TAB & "-i or /i" & @TAB & "Overview about a correct CONF_SDAT_UPD.INI file." & @CRLF & @CRLF
    $helpmsg = $helpmsg & @TAB & "This help: ?, -?, /?, h, -h, /h"

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

    $helpmsg2 = "List embedded parameters:" & @CRLF
    $helpmsg2 = $helpmsg2 & @TAB & "Path to update.ini on download page:" & @TAB & 'UPDATE_INI_URL="http://download.nai.com/products/datfiles/4.x/nai/update.ini"' & @CRLF
    $helpmsg2 = $helpmsg2 & @TAB & "Base path to SDATxxxx.exe:" & @TAB & @TAB & 'SDAT_URL="http://download.nai.com/products/licensed/superdat/english/intel/"' & @CRLF
    $helpmsg2 = $helpmsg2 & @TAB & "Local store path to INI file:" & @TAB & @TAB & 'UPDATE_INI_PATH="c:\temp\nai\update.ini"' & @CRLF
    $helpmsg2 = $helpmsg2 & @TAB & "Local store path for SDATxxxx.exe:" & @TAB & 'DEST_SDAT_PATH="c:\temp\nai"' & @CRLF & @CRLF
    $helpmsg2 = $helpmsg2 & @TAB & @TAB & "Help: ?, -?, /?, h, -h, /h"

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

    if $CmdLine[0]=0 then
    if FileExists($INI) Then
    $update_site_url = IniRead($INI, "SDATURL", "UPDATE_INI_URL","NotFound")
    $sdat_url = IniRead($INI, "SDATURL", "SDAT_URL","NotFound")
    $dest_sdat_path = IniRead($INI, "SDATPATH", "DEST_SDAT_PATH","NotFound")
    $update_ini_file = IniRead($INI, "SDATPATH", "UPDATE_INI_PATH","NotFound")

    if $update_site_url="NotFound" or $sdat_url="NotFound" or $dest_sdat_path="NotFound" or $update_ini_file="NotFound" Then
    MsgBox(0,"Error", "Not all entries in update.ini exist! Check values in CONF_SDAT_UPD.ini! "& @CRLF & @CRLF & $INIFILE)
    Exit 90
    EndIf
    Else
    ; use standard parameters, could be quite old... :)
    $update_site_url="http://download.nai.com/products/datfiles/4.x/nai/update.ini"
    $sdat_url="http://download.nai.com/products/licensed/superdat/english/intel/"
    $update_ini_file="c:\temp\nai\update.ini"
    $dest_sdat_path="c:\temp\nai"
    EndIf
    Else
    if $CmdLine[0]>0 then
    Select
    Case $CmdLine[1]="?" or $CmdLine[1]="-?" or $CmdLine[1]="/?" or $CmdLine[1]="h" or $CmdLine[1]="-h"or $CmdLine[1]="/h"
    MsgBox(0, "Installation parameter", $helpmsg)
    Exit 10
    case StringUpper($CmdLine[1])="-E" or StringUpper($CmdLine[1])="/E"
    MsgBox(0, "Installation parameter", $helpmsg2)
    Exit 10
    case StringUpper($CmdLine[1])="-I" or StringUpper($CmdLine[1])="/I"
    MsgBox(0, "INI configuration", $INIFILE)
    Exit 10
    ;Case StringUpper($CmdLine[1])="UPDATE_INI_URL" ; Command line or not Command line that's here the question...

    Case Else
    exit
    EndSelect
    EndIf
    EndIf

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

    ;$update_site_url="http://download.nai.com/products/datfiles/4.x/nai/update.ini"
    if $update_ini_file = "NotFound" Then
    $update_ini_file=@TempDir & "\nai\update.ini"
    EndIf

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

    if $dest_sdat_path = "NotFound" Then
    $dest_sdat_path=@TempDir & "\nai"
    EndIf

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

    ; check if directory for update.ini exist and if update.ini exist delete it...
    if FileExists($dest_sdat_path) <> 1 then
    DirCreate($dest_sdat_path)
    Else
    if FileExists($dest_sdat_path &"\update.ini") then FileDelete($dest_sdat_path &"\update.ini")
    EndIf

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

    ; download standard update.ini from McAfee page and save it in $update_ini_file
    InetGet($update_site_url, $update_ini_file, 1, 1)

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

    ; wait a bit, otherwise IniRead won't find a update.ini to read...
    Sleep(5000)

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

    ; get name of current SDATxxxx.exe from update.ini
    $SDAT_name=IniRead($update_ini_file, "SuperDat-IA32", "FileName", "NotFound")
    If $SDAT_name="NotFound" Then
    MsgBox(0,"Error", "Error: No SDAT entry in update.ini")
    Exit 92
    EndIf

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

    ;MsgBox(0, "SDATName", $SDAT_name)
    ;$SDAT_url = "http://download.nai.com/products/licensed/superdat/english/intel/" & $SDAT_name
    $Full_SDAT_url = $sdat_url & $SDAT_name
    ; check the size of the file
    $size=InetGetSize($Full_SDAT_url)
    ; download SDATxxxx.exe and save the file to $dest_sdat_path
    InetGet($Full_SDAT_url, $dest_sdat_path & "\" & $SDAT_name, 1, 1)
    $mypercent= $size/100 ; one percent of the size

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

    While @InetGetActive
    $view = (@InetGetBytesRead / $mypercent)
    $view = Round($view)

    TrayTip("Downloading " & $SDAT_name, "MBytes = " & Round(@InetGetBytesRead/1048576,2) & @CRLF & "Percent: " & $view, 10, 16)
    Sleep(250)
    Wend

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

    ;MsgBox(0, "Download finished! MBytes read: ", Round(@InetGetBytesRead/1048576,2))

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

    ;Execute the close environment when the script ends.
    Func onAutoItExit()
    EndFunc

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

    Func _GetParameters($s_ParamName)
    ;Create Param Name
    Local $s_RealParamName = "-" & $s_ParamName

    For $i = 1 To $CmdLine[0] Step 1
    If $s_RealParamName = $CmdLine[$i] Then
    If $i + 1 <= $CmdLine[0] Then
    Return $CmdLine[$i + 1]
    EndIf
    EndIf
    Next
    Return ""
    EndFunc ;==>_GetParameters

    [/autoit]


    mfg
    Axel

  • Hotkey Funktion dauert zu lange :-(

    • ahe
    • 17. Juni 2009 um 13:21

    Hallo,

    um welche Anwendung handelt es sich denn? Kommen beim Setup irgendwelche Meldungen hoch? Funktionieren die Installationsparameter nicht?

    Ggfs. findest Du hier http://www.appdeploy.com/packages/ oder hier http://www.windows-unattended.de/component/opti…ase/Itemid,467/ die richtigen Installationsparameter für die Anwendung.

    Ggfs. hilft es auch Euer/Dein bisheriges Skript zu posten... :)

    mfg
    Axel

  • Interne Festplatten und Partitionen ermitteln

    • ahe
    • 17. Juni 2009 um 12:33

    Der Vollständigkeit halber eine funktionierende Lösung für die Prüfung auf eine zweite Partition mit dem Laufwerksbuchstaben D:.
    Hierbei wird auch noch geprüft, ob die erste Platte evtl. noch eine zweite versteckte Partition enthält (kam bei unseren älteren Imageversionen noch vor...).
    Man kann das natürlich noch optimieren, in dem man beispielsweise der Funktion den Laufwerksbuchstaben als Parameter übergibt oder aber die Platte...

    Spoiler anzeigen
    Code
    . . .
    $drive = check_partition_as_drive_d()
    . . .
    
    
    
    
    Func check_partition_as_drive_d()
    	$ComputerName = "."
    	$wmiServices = ObjGet("winmgmts:{impersonationLevel=Impersonate}!//" & $ComputerName)
    	$wmiDiskDrive = $wmiServices.ExecQuery("SELECT * FROM Win32_DiskDrive")
    	For $DiskDrive In $wmiDiskDrive
    		$wmiDiskPartitions = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $DiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
    		For $DiskPartition In $wmiDiskPartitions
    			$wmiLogicalDisks = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $DiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
    			For $LogicalDisk In $wmiLogicalDisks
    				if $DiskPartition.DeviceID = "Disk #0, Partition #1" Then
    					if $LogicalDisk.DeviceID = "D:" then return $LogicalDisk.DeviceID
    				Else
    					if $DiskPartition.DeviceID = "Disk #0, Partition #2" Then
    						if $LogicalDisk.DeviceID = "D:" then return $LogicalDisk.DeviceID
    					EndIf
    				Endif
    			Next
    		Next
    	Next
    EndFunc
    Alles anzeigen

    mfg
    Axel

  • Netzlaufwerke & Netzwerkdrucker anderer User ausfindig machen

    • ahe
    • 17. Juni 2009 um 12:22

    Danke für den Hinweis, probiere ich beim nächsten Mal.

    Schade eigentlich, dann kann man sich den Editor doch eigentlich sparen...

    mfg
    Axel

  • Netzlaufwerke & Netzwerkdrucker anderer User ausfindig machen

    • ahe
    • 17. Juni 2009 um 12:06

    Nun wenn du den angemeldeten Benutzer herausbekommen willst, könnte dieses Skript helfen.
    Allerdings ist das Skript dafür ausgelegt, mit dem "Local System" Account auf dem Rechner zu laufen, musst es also etwas umbauen.
    (Außerdem muss WMI aktiviert/installiert sein, könnte ansonsten bei W2K Probleme geben.)

    Spoiler anzeigen
    [autoit]


    ; check for logged on user
    Global $loggedOnUserValue = RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\", "AltDefaultUserName")

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

    ;Msgbox(4096,"Check start","Check if a user is logged on...")
    $loggedOnUserFlag = LoggedOnUser()
    if $loggedOnUserFlag = 0 Then
    Msgbox(4096,"Check","No user is logged on!")
    Else
    Msgbox(4096,"Check","User " & $loggedOnUserValue & " is logged on")
    EndIf

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

    Func GetLoggedOnUser()
    local $ReturnValue[100][4]
    $user=1

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

    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @ComputerName & "\root\CIMV2")
    if @error then
    Msgbox(4096,"Error","Error Getting an WMI Object. Error code: " & hex(@error,8))
    SetError(@error)
    Return
    endif

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

    $colItems = $objWMIService.ExecQuery("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10 OR LogonType = 11")
    For $objItem in $colItems
    $colItems2 = $objWMIService.ExecQuery("Associators of {Win32_LogonSession.LogonId=" & $objItem.LogonId & "} Where AssocClass=Win32_LoggedOnUser Role=Dependent")
    For $objItem2 in $colItems2
    $ReturnValue[$user][0]=$objItem2.Name
    $ReturnValue[$user][1]=$objItem2.Domain
    $ReturnValue[$user][2]=$objItem2.FullName
    Switch $objItem.LogonType
    case 2
    $ReturnValue[$user][3]="Console"
    case 10
    $ReturnValue[$user][3]="Remote"
    case 11
    $ReturnValue[$user][3]="Interactive"
    case Else
    $ReturnValue[$user][3]=$objItem.LogonType
    EndSwitch
    $user=$user + 1
    If $user > 100 Then
    Msgbox(4096,"Error","Maximum number of user reached.")
    SetError(100)
    Return
    EndIf
    Next
    Next

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

    If $user > 1 then
    $ReturnValue[0][0]=$user - 1
    Else
    $ReturnValue[0][0]=0
    EndIf

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

    return $ReturnValue
    EndFunc

    [/autoit]

    mfg
    Axe

    P.S.: warum geht eigentlich immer die Formatierung den Bach herunter, sobald ich die Vorschau wähle oder abspeichere... :wacko:

  • Interne Festplatten und Partitionen ermitteln

    • ahe
    • 10. Juni 2009 um 22:28

    Danke für eure Hinweise.

    Es ist wirklich die Frage, ob es den Aufwand lohnt...

    Mit DEVCON bekomme ich schon etwas mehr Info's...

    Code
    devcon.exe resources =DiskDrive
    
    
    IDE\DISKHITACHI_HTS721010G9SA00_________________MCZOC10H\5&1F698B3F&0&0.0.0
    Name: Hitachi HTS721010G9SA00
    Device is not using any resources.
    IDE\DISKTOSHIBA_THNCF1G02MA_____________________3.10____\54534243314730323033363
    03943333234353441
    Name: TOSHIBA THNCF1G02MA
    Device is not using any resources.
    USBSTOR\DISK&VEN_FUJITSU&PROD_MHZ2500BT_G2&REV_\0000000000001&0
    Name: FUJITSU MHZ2500BT G2 USB Device
    Device is not using any resources.
    3 matching device(s) found.
    Alles anzeigen

    Scheint vielleicht doch ein Weg zu sein, BugFix hat da doch schon "etwas" Vorarbeit geleistet:

    Manage USB-Drives per devcon.exe

    oder mit der Idee von Eukalyptus...
    [ gelöst ] USB-Hardware-ID auslesen

    Vielleicht lässt sich ja etwas mit den folgenden Zeilen anfangen...

    [autoit]

    $ComputerName = "."
    $wmiServices = ObjGet("winmgmts:{impersonationLevel=Impersonate}!//" & $ComputerName)
    $wmiDiskDrive = $wmiServices.ExecQuery("SELECT * FROM Win32_DiskDrive")
    For $DiskDrive In $wmiDiskDrive
    $wmiDiskPartitions = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $DiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
    For $DiskPartition In $wmiDiskPartitions
    $wmiLogicalDisks = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $DiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
    For $LogicalDisk In $wmiLogicalDisks
    ConsoleWrite($DiskPartition.DeviceID & @LF & $LogicalDisk.DeviceID & @LF & @LF)
    Next
    Next
    Next

    [/autoit]

    Ausgabe:

    Code
    Disk #0, Partition #0
    C:
    
    
    Disk #0, Partition #1
    D:
    
    
    Disk #1, Partition #0
    F:
    
    
    Disk #2, Partition #0
    G:
    Alles anzeigen

    mfg
    Axel

  • Interne Festplatten und Partitionen ermitteln

    • ahe
    • 10. Juni 2009 um 16:31

    Hallo,

    ich habe ein Problem mit einem größeren SW Paket. Im Paket prüfe ich ab, ob genügend Platz auf Laufwerk C:\ (1,6GB!) vorhanden ist und starte dann die Installation. Leider ist auf einigen älteren Rechnern nicht genügend Platz, aber es existiert ggfs. eine zweite Partition, auf der ich das Paket entpacken und von der ich aus installieren könnte. (Voraussetzung ist natürlich, dass auch dort genügend Platz ist.)
    Ich will also eine ähnliche Funktion für mein Paket haben, wie es Microsoft für seine Pakete macht. MS Pakete prüfen, auf welcher Partition/Platte sie zum Entpacken den meisten Speicher frei haben...

    Jetzt gibt es nur das Problem, wie erkenne ich, ob ich eine zweite Partition habe oder aber eine zweite interne Platte habe, die ich nutzen kann?
    Mit den folgenden Zeilen werden alle Festplatten erkannt, aber leider auch extern angeschlossene USB Festplatten und diese will ich aus verschiedenen Gründen nicht nutzen (wie ich feststellen mußte nutzt MS auch die externen Platten... :wacko: )

    [autoit]

    $var = DriveGetDrive ( "FIXED" )
    If NOT @error Then
    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
    MsgBox(4096,"Drive " & $i, $var[$i])
    Next
    EndIf

    [/autoit]

    Nun habe ich mir diesen (wirklich tollen) Thread (SB v X.0) und die zugehörigen Dateien angeschaut, aber leider nicht allzuviel verstanden.

    Meine Versuche mit WMI zeigten auch immer die externe Festplatte: (hier das Beispiel aus der Scriptomatic, in dem, neben der internen Festplatte mit zwei Partitionen und der externen Festplatte, auch eine im PC Card Adapter steckende CompactFlash Disk als LogicalDisk erkannt wurde... )

    [autoit]

    ; Generated by AutoIt Scriptomatic
    $file = FileOpen(@ScriptDir & '\LogicalDiskToPartition.log', 2)
    If $file <> -1 Then
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

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

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "Antecedent: " & $objItem.Antecedent & @CRLF
    $Output = $Output & "Dependent: " & $objItem.Dependent & @CRLF
    $Output = $Output & "EndingAddress: " & $objItem.EndingAddress & @CRLF
    $Output = $Output & "StartingAddress: " & $objItem.StartingAddress & @CRLF
    FileWriteLine($file, $Output)
    FileWriteLine($file, '---------------------NewLine--------------------------------')
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_LogicalDiskToPartition" )
    Endif
    EndIf

    [/autoit]


    Ausgabe:

    Code
    Computer: localhost
    ==========================================
    Antecedent: \\MeinRechner\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
    Dependent: \\MeinRechner\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    EndingAddress: 21476206079
    StartingAddress: 32256
    ---------------------NewLine--------------------------------
    Antecedent: \\MeinRechner\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #1"
    Dependent: \\MeinRechner\root\cimv2:Win32_LogicalDisk.DeviceID="D:"
    EndingAddress: 100027630079
    StartingAddress: 21476206080
    ---------------------NewLine--------------------------------
    Antecedent: \\MeinRechner\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #0"
    Dependent: \\MeinRechner\root\cimv2:Win32_LogicalDisk.DeviceID="F:"
    EndingAddress: 1023934463
    StartingAddress: 32256
    ---------------------NewLine--------------------------------
    Antecedent: \\MeinRechner\root\cimv2:Win32_DiskPartition.DeviceID="Disk #2, Partition #0"
    Dependent: \\MeinRechner\root\cimv2:Win32_LogicalDisk.DeviceID="G:"
    EndingAddress: 500105249279
    StartingAddress: 32256
    ---------------------NewLine--------------------------------
    Alles anzeigen

    Gibt es eine Möglichkeit die externen USB Platten auszuschließen und nur das Laufwerk D:\ bei einer internen Festplatte zu nutzen?

    mfg
    Axel

  • Umzug des Vorlagenpfades in Worddateien

    • ahe
    • 5. Juni 2009 um 23:20

    So wie es aussieht, habe ich eine Möglichkeit gefunden den Pfad der (zusätzlichen) Vorlage zu ermitteln: :D (manchmal hilft die Online-Hilfe von VBS doch...)

    AutoIT Variante:

    [autoit]

    #include <WindowsConstants.au3>

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

    Const $wdDialogToolsTemplates = 87

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

    $objWord = ObjCreate("Word.Application")
    $objDoc = $objWord.Documents.Open ("c:\temp\MeineWordDatei.doc")
    $objTemplate = $objDoc.AttachedTemplate
    $dlgTemplate = $objWord.Dialogs($wdDialogToolsTemplates)
    $strPath = $dlgTemplate.Template

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

    MsgBox(0,"template test", $strPath)
    $objDoc.Close
    $objWord.Quit

    [/autoit]

    VBSkript Variante:

    Code
    Const wdDialogToolsTemplates = 87
    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Open("c:\temp\MeineWordDatei.doc")
    Set objTemplate = objDoc.AttachedTemplate
    Set dlgTemplate = objWord.Dialogs(wdDialogToolsTemplates)
    strPath = dlgTemplate.Template
    WScript.Echo strPath 
    objWord.Quit

    Jetzt muss ich nur noch den Austausch des alten Pfades gegen einen neuen hinbekommen, dann die Pfadeingabe zu den Word-Dateien variabel gestalten, ggfs. den Pfad rekursiv durcharbeiten lassen.

    Vielleicht wäre es auch gut eine Abfrage zu machen, ob der Austausch gewünscht ist oder nur eine Auflistung der Dateien mit ihren Vorlagen erstellt werden soll, des Weiteren ob vielleicht nur ein Teil des Pfades ersetzt werden soll...

    Vielleicht hat ja noch jemand Lust etwas zu basteln... ;)

    Jetzt erst einmal gute Nacht...
    Axel

  • Pingergebnis ausgeben

    • ahe
    • 5. Juni 2009 um 17:43

    Helfen dir die folgenden Beispiele vielleicht schon?

    [ offen ] Console write/read
    [ offen ] Ping, Tracert, Nslookup in neuem GUI-Fenster ausgeben

    mfg
    Axel

    Vegiss die Beispiele: Micha_he hat eine fertige Alternative... :)

  • Programm automatisch installieren

    • ahe
    • 5. Juni 2009 um 17:31

    Die meisten Setups können mit Hilfe von Parametern (switches, Schaltern) aufgerufen werden, um sie zum Beispiel in einen bestimmten Ordner zu installieren oder einfach ohne jegliche Benutzereingabe laufen zu lassen.

    Häufig kann man auf der Kommandozeile mit Hilfe der Parameter /? oder -? oder /h oder -h die übrigen Installationsparameter erfahren.

    Ich würde jetzt als erstes die Kommandozeile für die Installation zusammenbauen und dann ein AutoIt-Skript daraus erstellen.
    Die Kommandozeile könnte ja so aussehen: (ich kenne die Anwendung leider nicht, daher kann ich nix zum Schalter "/license" sagen, ob man ihn überhaupt bei deiner Version braucht)

    Code
    SetupAnyDVD6555.exe /silent /noautorun /noreboot /license=c:\temp\Key.AnyDVD



    Hilfreich sind auch die Seiten, die ich dir angegeben habe, dort findet man unzählige Tipps...

    mfg
    Axel

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™