If oder If Not - das ist hier die Frage

  • Simple Geschichte eig.
    Ich möchte halt etwas in Abhängigkeit machen, ob eine Bedinung erfüllt ist, oder nicht. Das wollte ich mit If Not machen.
    Das funktioniert aber nicht. Dann mal gegooglet, gesehen dass man es auch mit <> machen kann (muss?).
    Funktioniert aber auch nicht wie es soll :pinch:

    Das habe ich:

    Spoiler anzeigen
    [autoit]

    Local $tmp = @ScriptDir & "\tmp.txt"
    Local $atmp
    _FileReadToArray($tmp, $atmp)
    Global $pfad = "G:\Installationen\Installationen.exe"
    Global $abenutzername[4] = ["Benutzer1", "Benutzer2", "Benutzer3", "Benutzer4"]

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

    For $e = 1 To Ubound($atmp) - 1
    For $r = 0 To Ubound($abenutzername) - 1
    If $abenutzername[$r] <> $atmp[$e] Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next
    Next

    [/autoit]

    Sinn davon: Von einem RunAs-Script wo Benutzer und PW abgefragt und in eine
    Variable geschrieben werden, wird der Benutzer bzw. die Variable wo der Benutzer drin
    ist in eine temporäre Textdate (tmp.txt) geschrieben. Dieser Benutzer wird nochmal beim start des
    aufgerufenen Script abgefragt und mit den 4 Benutzern im Array verglichen. Stimmt der Benutzer
    in der tmp-Datei mit keinem der 4 ein beendet sich das Script mit einer Fehlermeldung.
    Sinn hiervon ist wiederum, dass das aufzurufende Script nicht ohne das RunAs-Script gestartet werden
    soll.

    Edit: Starten tut Ubound bei 1 und nicht bei null weil in der ersten Zeile, warum auch immer, die
    Anzahl der Zeilen, also 1, steht. Die tmp-Daei wird nach dem erfolgreichen Programmaufruf
    natürlich gelöscht.

    2 Mal editiert, zuletzt von Scritch (16. November 2010 um 08:44)

  • Ja, in AutoIt wird != als <> dargestellt...
    Zum 2. Problem, dass in der Row[0] des Arrays, die Anzahl Zeilen stehen...

    Ich denke, du verwendest

    Code
    _ArrayUnique


    Dieses setzt an die erste Position des Arrays, die Anzahl an zurückgegebenen Strings...

    Was wird denn als Fehler ausgegeben?

  • Deine 2te For Schleife durchläuft das gesammte Array $abenutzername. Wenn der Benutzername aus $aTmp nicht gefunden wurde, beendest du das Skript. Dieser Fall tritt aber spätestens beim 2ten Durchlauf unweigerlich ein.

    Du könntest stattdessen mit _ArraySearch() arbeiten.

  • Öhm, das ganze müsste noch anders aufgebaut sein...
    Sagen wir, in der tmp.txt steht Benutzer 3

    Nun geht das Programm folgendes durch

    Code
    Wenn Benutzer 1 ($abenutzername[0]) nicht das gleiche ist wie Benutzer 3 ($atmp[1])
    Beende das Script

    Du solltest das ganze mit einem = und nicht mit <> machen. Die MsgBox würde dann jedoch ausgeben, sie sind berechtigt.

    Daher folgendes:

    [autoit]


    Local $tmp = @ScriptDir & "\tmp.txt"
    Local $atmp
    _FileReadToArray($tmp, $atmp)
    Global $pfad = "G:\Installationen\Installationen.exe"
    Global $abenutzername[4] = ["Benutzer1", "Benutzer2", "Benutzer3", "Benutzer4"]

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

    For $e = 1 To Ubound($atmp) - 1
    For $r = 0 To Ubound($abenutzername) - 1
    If $abenutzername[$r] = $atmp[$e] Then
    MsgBox(0, "", "Sie sind zur Installation berechtigt und können weiter machen!")
    Exit
    EndIf
    Next
    Next

    [/autoit]

    Greetz

  • nimm stattdessen ExitLoop und eine Bool

    Spoiler anzeigen
    [autoit]

    Local $tmp = @ScriptDir & "\tmp.txt"
    Local $atmp
    _FileReadToArray($tmp, $atmp)
    Global $pfad = "G:\Installationen\Installationen.exe"
    Global $abenutzername[4] = ["Benutzer1", "Benutzer2", "Benutzer3", "Benutzer4"], $bAllowed = False

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

    For $e = 1 To Ubound($atmp) - 1
    For $r = 0 To Ubound($abenutzername) - 1
    If $abenutzername[$r] = $atmp[$e] Then
    $bAllowed = True
    ExitLoop
    EndIf
    Next
    Next

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

    if not $bAllowed then
    MsgBox(0, "", "Sie sind zur Installation nicht berechtigt!")
    exit
    EndIf

    [/autoit]

    mfg AutoBert

  • @Fr34k: Fehlermeldung bekomme ich keine. Das Script öffnet sich, auch wenn in der tmp.txt ein anderer Benutzername steht als es darf.
    @Mobi: Deine Möglichkeit habe ich in meinem RunAs-Script z. T. mit eingebaut:

    Spoiler anzeigen
    [autoit]

    $commandName = "copy Q:\Installationen.exe d:\"

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

    Global $benutzername = InputBox("Benutzername", "Geben Sie bitte Ihren Benutzernamen ein.", @UserName)
    Global $passwort = InputBox("Passwort", "Geben Sie bitte Ihr Passwort ein.", "", "*")
    Global $domain = "Domäne"
    Global $pfad = "D:\Installationen.exe"
    Global $abenutzername[4] = ["Benutzer1", "Benutzer2", "Benutzer3", "Benutzer4"]

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

    For $r = 0 To Ubound($abenutzername) - 1
    If $abenutzername[$r] <> $benutzername Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next
    Run(@ComSpec & " /c " & $commandName, "")
    Run(@ComSpec & " /c Exit", "")

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

    While
    If FileExists($pfad) Then ExitLoop
    WEnd

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

    RunAs($benutzername, $domain, $passwort, 0, $Pfad)
    Exit

    [/autoit]

    i2c: Haste Recht. Mache ich dann mit Arraysearch

    Einmal editiert, zuletzt von Scritch (15. November 2010 um 13:08)

  • Wo denn? Sehe ich nicht.


    Wo?
    Du:

    Spoiler anzeigen
    [autoit]

    For $i = 0 To Ubound($aUserAuthorized) - 1
    If $sUser = $aUserAuthorized[$i] Then $fAuthorized = 1
    Next
    If $fAuthorized Then
    RunAs($sUser, "Domäne", $sPass, 0, $sPath)
    _IrgendeineFunktion()
    Else
    MsgBox(0, "", "Sie sind zur Installation nicht berechtigt!")
    EndIf

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

    Ich:

    Spoiler anzeigen
    [autoit]

    For $r = 0 To Ubound($abenutzername) - 1
    If $abenutzername[$r] <> $benutzername Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next
    RunAs($benutzername, $domain, $passwort, 0, $Pfad)
    Exit

    [/autoit]


    Abgesehen von dem Funktionsaufruf bei dir ist es doch eig. das selbe.
    Mhh... ne, eine Nachricht sollte nicht kommen, wenn alles ok ist, Fr34k ;)

  • Dann nimm meine Version, welche von autoBert abgeändert wurde... Oder ist es seine Version?^^
    Kp, nimm die von autoBerts Post, dann gehts :)

  • Scritch: Schau dir mal meine und deine genauer an. Wenn du bei deiner z.B. Benutzer4 bist, bricht er schon ab beim ersten Durchlauf weil ja Benutzer1 <> Benutzer4 ist.

  • Was ist mit dem 4. Post von i2c? Das hat mich gerade etwas aus der Bahn geworfen...

    Ich probiere AutoBerts Version gleich auch nochmal aus. Habe hier sonst auch noch was:

    Spoiler anzeigen
    [autoit]

    For $e = 0 To Ubound($atmp) - 1
    For $r = 0 To Ubound($abenutzername) - 1
    _ArraySearch($abenutzername, $atmp, 1)
    If @error Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next
    Next

    [/autoit]


    Oder brauche ich Array mit nur einem Eintrag nicht in eine Schleife packen?

  • Ich dachte mehr in diese Richtung

    [autoit]


    For $i = 1 To Ubound($atmp) - 1 ;für den Fall, das mehr als ein Benutzer in der Datei steht
    _ArraySearch($abenutzername, $atmp[$i])
    If @error Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next

    [/autoit]
  • autoBert: siehe mein Post ;)


    ja gleiches Prinzip, schon oft probiert, nur durch ExitLoop spar ich ein paar ms

    Dann nimm meine Version, welche von autoBert abgeändert wurde... Oder ist es seine Version?^^
    Kp, nimm die von autoBerts Post, dann gehts :)

    deine Version kann nicht laufen da EXIT

    Ich dachte mehr in diese Richtung

    ideale Lösung, da nochmals ein paar ms eingespart werden.

    noch eine Lösung:

    Spoiler anzeigen
    [autoit]

    Global $sUser = EnvGet("Username")
    MsgBox($sUser)
    Global $pfad = "G:\Installationen\Installationen.exe"
    Global $abenutzername[3] = ["autoBert", "i2c", "m-obi"]

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

    _ArraySearch($abenutzername, $sUser)
    If @error Then
    MsgBox(0, "angemeldet als " & $sUser, "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf

    [/autoit]

    hier wird keine TXT-Datei verwendet, der User hat sich ja der Windowsanmeldung unterzogen,

    mfg autoBert

  • Was'n ms in dem Zusammenhang?
    Diese Lösung funktioniert, wie es soll:

    Spoiler anzeigen
    [autoit]

    For $i = 1 To Ubound($atmp) - 1 ;für den Fall, das mehr als ein Benutzer in der Datei steht
    _ArraySearch($abenutzername, $atmp[$i]) If @error Then
    MsgBox(0, "", "Sie sind zur Installation nich berechtigt!")
    Exit
    EndIf
    Next

    [/autoit]


    Vielen Dank für Eure Hilfe Jungs :thumbup:

    PS: Noch eine andere Sache nebenbei: Manchmal beim Quelltext einfügen behält er nicht die Formatierung bei, sondern schreibt alle Zeilen hintereinander.
    Was mag das sein? Ist wie gesagt nicht immer...