RequireAdmin in If

  • Hallo,

    ich habe das #RequireAdmin in einer If-Bedingung

    [autoit]

    If Not FileExists($sSettingsPath & "\" & $sSettingsIniFilename) Then
    #RequireAdmin

    [/autoit]


    Nun beim ersten Starten der Anwendung ist die Bedingung true, dann wird die Datei erstellt. Aber beim zweiten Starten wird #RequireAdmin
    trotzdem ausgeführt und das UAC-Fenster erscheint. Weiß jemand warum das so ist?

  • So viel ich weis wird #RequireAdmin immer ausgeführt wenn es im Script vorhanden ist, da man beim Start eines Programmes festlegen muss, welche Rechte es hat. Kann mich aber auch irren. ;)

    Gruss Shadowigor

  • Das hat nix mit dem was #requireadmin bewirkt zu tun, sondern damit, dass #requireadmin wie alle Code Zeilen mit "#" Präprozessor bzw Präcompiler Anweisungen sind. Diese werden nicht zur Laufzeit interpretiert, sondern bereits vor dem compilen, sie haben also Einfluss darauf wie der compiler den eigentlichen Quellcode verarbeitet und letzten Endes die ausführbare exe Datei erstellt.

    So weist #include den Compiler z.B. an Quellcode von weiteren Dateien mit zu kompilieren. Diverse andere Anweisungen sorgen dafür, dass z.B eine Versionsnummer, ein Icon, Copyright Infos usw. in die exe eingebunden werden, eine Komprimierung (UPX) oder Verschleierung (Obfuscator) des Quellcodes erfolgt, oder aber im Falle von #requireadmin ein bestimmtes Attribut gesetzt wird, dass das Betriebssystem veranlasst höhere Rechte für die exe anzufordern.

    2 Mal editiert, zuletzt von misterspeed (30. Juli 2012 um 22:45)

  • Achja stimmt ja, es gehört mit zum Präprozessor. Das erklärt auch warum danke.

  • haha habs.

    Hab das RequireAdmin und die Funktionen, wo ich es brauche, in ein Script gepackt. Dieses dann kompiliert und als Hex-Stream in mein Hauptscript reingemacht. Ist zwar nen bisschen viel, aber egal erstmal. Mal schauen evtl. mach ich da später noch Base64.
    Und in der If-Bedingung erstelle ich die exe, führe sie aus und lösche sie dann wieder.
    Somit mach er es nur in der If-Bedingung ;)

  • Zitat

    und als Hex-Stream in mein Hauptscript reingemacht. Ist zwar nen bisschen viel, aber egal erstmal. Mal schauen evtl. mach ich da später noch Base64.

    [autoit]

    fileinstall()

    [/autoit]

    hätte aber auch gereicht ^^

  • Du kannst auch von der Hauptdatei aus ein weiteres Script starten welches nur

    [autoit]

    #RequireAdmin
    Run("Pfad zum Hauptscript")

    [/autoit]

    enthält, und dann das Hauptscript beenden.
    Die Rechte sollten an den Prozess weitervererbt werden.

    Edit: Kleines Beispiel:

    Beispiel
    [autoit]

    ;Main.exe
    If IsAdmin() Then
    MsgBox(64, "Admin", "I am admin!")
    Else
    If MsgBox(64 + 4, "No Admin", "I need admin rights. Gimme?") = 6 Then
    Run(@ScriptDir & "\Admin.exe")
    Exit
    Else
    Exit
    EndIf
    EndIf

    [/autoit][autoit]

    ;Admin.exe
    #RequireAdmin
    Run(@ScriptDir & "\Main.exe")

    [/autoit]
  • misterspeed: Eben nicht. Ich will ja nicht das die Exe bei jedem Starten des Programms erstellt wird. Ich benötige sie ja nur beim ersten Start.

    name22: Danke. Aber das Hauptscript will ich ja nicht beenden. Außerdem benötige ich die Rechte nur zum Registrieren meines Dateitypen, sonst nicht im Programm.

    So sieht das ganze aus

    Spoiler anzeigen
    [autoit]

    If Not FileExists($sSettingsPath & "\" & $sSettingsIniFilename) Then
    $hFile = FileOpen(@TempDir & "\Tmp.exe", 1 + 16)
    FileWrite($hFile, SCRIPT_RegistryFiletype())
    FileClose($hFile)
    ShellExecuteWait(@TempDir & "\Tmp.exe", @ScriptDir)
    FileDelete(@TempDir & "\Tmp.exe")
    _RefreshIcons()
    ...
    EndIf

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

    Func SCRIPT_RegistryFiletype()
    Local _
    $sData = "0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000F80000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000C21E94BF867FFAEC867FFAEC867FFAEC153162EC847FFAEC9DE250EC297FFAEC9DE251ECB37FFAEC8F0779EC8F7FFAEC8F0769ECA77FFAEC867FFBEC967DFAEC9DE24EECCE7FFAEC9DE264EC9A7FFAEC9DE260EC877FFAEC867F6DEC877FFAEC9DE267EC877FFAEC52696368867FFAEC0000000000000000504500004C010300ECBA254F0000000000000000E00023010B010A00003004000080000000600700708E0B000070070000A00B000000400000100000000200000500000000000000050000000000000000200C00001000000000000002000080000040000010000000004000001000000000000010000000000000000000000038100C00B003000000A00B00387000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000600700001000"
    $sData &= "000000000000040000000000000000000000000000800000E0555058310000000000300400007007000022040000040000000000000000000000000000400000E02E727372630000000080000000A00B000074000000260400000000000000000000000000400000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332E303700555058210D09080AF846806D5206FC6A3F610B00681E04001FEE0900261300"
    $sData &= "B3FFFBFFFF558BEC33C081ECA80300003805EA744900744E68A418508D955CFCFFFFDFFEEDDD52A22789819C0124E813011F3CA118751E83C40C8D8DCDEDDCBF583C516A02C785117F8985631E6024FF373B5C00FF15902448008BE55DC3CC41DEFEFF8B46245333DB3BC30F85044F02001A2C895E24EFBE69CF895E30043438885E105B6F807E0900BF3DD86C3A294C6A080005D3F60485C074108B26B8FFDB1789064E04894804FF06894604C3168E1B6F7F9036DFBE8B45148B4D585508578B9FFD02FB7D0C5051528C36FC5F5DC210003F83E4F853FFE01BFC8B5D08563B1DB7756681FF117C732983FF12723BB8E005363DE8954A02840C9F5A558A0F360B7E450C52505753B488265E5BB8C20C66BBF9B4006013743810764C181203D39AF9EC0F87BC086CBA9E2C11107D1F3CFCB3B175ACE913029FC6919291EBA8133CD87EA8681087CA8BF334024C8EB1BFED3F6F7E118D47FF83F806A271FF0024852C77CF41C31240160104D4B96FE837FEF369A76D306A0022D07B6A0068EEFBBC3F3357E068284E4848DC833D6FCEA76DB000A3B7758F26D85EA3B8078FE07CA901048285FBB67DF2DA3F60A05A8BFFDB11F2B6062090AF42D3B186F30F7FDF9AACF11D87F64853577886089D58018DF031E9F853506054A178FCE051F8089CF00B7C803DD8DD154A7B903C10EC5C0889B567893777988E9DB302AF85316080"
    ...
    $sData &= "C70C0C19392E7D12A7DD8F601EF7B2D174F0B93FBD1AD72CC340EEDE10E06820B041BF4441C29A8B761FFD6579EB7A601628261307DB6B8450DAC60065A911BE6354C0B253A45B9D19B53B575308E6D0BA9559C98CA3D414D579EB6D3B8E1B239B99A0178C2F52F6B4F3AD39034F037D68BDC199384BCBEBDC8C2D53EDCF8F6664E1291FD5A1D9E4BF48DED9925DB671DBE2EDEC0651C6C0D8B4C9C7ACDF212AEBED5CCE6CBEAE1927C04E46EA1C174F58DF6342D631979DE5C95BF4996760D0D576A8C3D7EF2612D9F61679267ADA60ED2906D8360A9C464664756AC8DDB94470747ABA2641138984BD13E168BA7F549A00398C7306F72625F5AB3849C3DAF6C67ED9C3C5744554B669369174BFE18FA9676C77DCFB63328BF087F3F50134C7D2D5709F3B9880FB456A0C777C0AC6B7675516F9A90B62FF680DCF9075F9D4B2DE612496D4F2D34CE0735EF068C1A71B84F3FB68D2FA2353AA398EE6135EACC9DC669E65A84933F6618DF48EF74339856FF1A7E6DE5A035DC1EB7B324B04D7A16631154FEAECFF21E6122AF9CB03D838EF7734513C62E831F3F2DE439D2CC428594CEFB103914665ED6663770F5BAD666168FBCE20B60E0AEFA853F5269748B0F38080E94B240461D13423C5043A8C5AD3156B9225E9DAD5F23F3C295E2FEAA6B3A3FF52D9C5DEC608D2C339916A8AA155C7E5F29B55BF80A7E7834584085EA8"
    $sData &= "D6CCC5EA98AC39954113772605BD612EA2F9263976833F318A66C43B40B7C598102FB5B1308662AD9514E920073BF282F324AE913027E1358C06B25F0301C019C45BBABB0CD0BAC6BB55A83EC7BE01D479AD420726F0D45042EEAFECE3C72BFBC97DE03FF2D56AC8342E035E4618E8EABB3D9B66D9791E0A73382A9265827E18B72F39FCA4529CE566D27336A747D25D640CD137727AD40F9CA9997DCCCE65F4F1D4B9DFC1D019487B55D28E1950698351E3E5C89F652B3487ED1BA0F9EC0748918C841FB8A5348E0DA0EF5DA212F6455B8E769754C36C694994BD385890228E393F162B2C61844C1ECDC440F5BCD7EFD84AC3EDE15ECD10C37708CA21899B1CDC0C3B250311168F4D912BA0D8CAA6A8A5DACEB6A7BCE2950CE9DA0AAE584907FF47FD40E9679598CF178422E0099E4EE4BFE31871A013BAAD77AC353A665600C9B738BBCE62E5A6000215E64001BB3513D73FDD40159C610E60837811AEFA655276F959760B2B6E6B78FA89BCFA91426A62763D220B61F3655D96380761C71F7ACFD30D47D79DAB389F2249B3A5DB422755E7A4F80A764A4BFCF03659E679DCE4B7D4C2B2B325C606E2FE48475409F60C5E577848E124575795D9A32BA995705307E39DB1BE6F5AD52270ABA95E56DD46B29E102E29308A758605DD81DEE0F67B1E026264410CF6E51918A718DF55318F75126A4AAE10E87763397497FFF440"
    $sData &= "092627E0A66180EB438FEBBB11A1FED3BB7AE1330F3294984155332145413036"
    Return Binary($sData)
    EndFunc

    [/autoit]
  • misterspeed: Eben nicht. Ich will ja nicht das die Exe bei jedem Starten des Programms erstellt wird. Ich benötige sie ja nur beim ersten Start.

    name22: Danke. Aber das Hauptscript will ich ja nicht beenden. Außerdem benötige ich die Rechte nur zum Registrieren meines Dateitypen, sonst nicht im Programm.

    So sieht das ganze aus

    Spoiler anzeigen
    [autoit]

    If Not FileExists($sSettingsPath & "\" & $sSettingsIniFilename) Then
    $hFile = FileOpen(@TempDir & "\Tmp.exe", 1 + 16)
    FileWrite($hFile, SCRIPT_RegistryFiletype())
    FileClose($hFile)
    ShellExecuteWait(@TempDir & "\Tmp.exe", @ScriptDir)
    FileDelete(@TempDir & "\Tmp.exe")
    _RefreshIcons()
    ...
    EndIf

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

    Func SCRIPT_RegistryFiletype()
    Local _
    $sData = "0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000F80000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000C21E94BF867FFAEC867FFAEC867FFAEC153162EC847FFAEC9DE250EC297FFAEC9DE251ECB37FFAEC8F0779EC8F7FFAEC8F0769ECA77FFAEC867FFBEC967DFAEC9DE24EECCE7FFAEC9DE264EC9A7FFAEC9DE260EC877FFAEC867F6DEC877FFAEC9DE267EC877FFAEC52696368867FFAEC0000000000000000504500004C010300ECBA254F0000000000000000E00023010B010A00003004000080000000600700708E0B000070070000A00B000000400000100000000200000500000000000000050000000000000000200C00001000000000000002000080000040000010000000004000001000000000000010000000000000000000000038100C00B003000000A00B00387000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000600700001000"
    ...
    $sData &= "092627E0A66180EB438FEBBB11A1FED3BB7AE1330F3294984155332145413036"
    Return Binary($sData)
    EndFunc

    [/autoit]
  • misterspeed: Eben nicht. Ich will ja nicht das die Exe bei jedem Starten des Programms erstellt wird. Ich benötige sie ja nur beim ersten Start.

    Joar und genau das kann man soweit ich mich recht entsinne auch mit fileinstall machen. Die "installierten" Files in der main.exe werden nämlich erst dann entpackt, wenn die fileinstall Zeile des Scriptes ausgeführt wird. Hier kann man dann wie bei deiner hexstring Methode natürlich auch mit if Bedingungen arbeiten.


    Beispiel:

    [autoit]


    $doinstall = False ; bei False wird nix "installiert", bei true schon ;)

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

    If $doinstall = True Then
    FileInstall("C:\test\filestoinstall\install.txt",@ScriptDir & "\itwasdone.txt",1)
    Else
    MsgBox(0,"false","nothing was installed")
    EndIf

    [/autoit]
  • Achso. Muss ich mal probieren. Mal schauen ob die Exe dann kleiner wird. Hab jetzt schon Base64 geacht, das bringt ein bisschen was.

  • Also es ist schonmal kleiner. Aber es ist langsamer beim ausführen.
    Und danach deleten klappt auch nicht, muss ich wohl am Anfang des Scripts machen. Dann ist sie beim nächsten Aufruf des Programs wech.

    [autoit]

    FileInstall("H:\PVI\RegFiletype.exe", @DesktopDir & "\RegFiletype.exe")
    ShellExecuteWait(@DesktopDir & "\RegFiletype.exe", FileGetShortName(@ScriptDir))
    FileDelete(@DesktopDir & "\RegFiletype.exe")

    [/autoit]
  • Warum das löschen nicht gehen soll versteh ich nicht, das sollte ja soweit identisch mit deiner Lösung sein, oder ging es da auch nicht? Grundsätzlich kannste doch aber auch eine selfdelete Funktion in diese "gibmiradminrechte.exe" reinschreiben.

    nutz Scite und gibt selfdelete ein und dann STRG+B

  • Hab noch nen Sleep(200) vor FileDelete eingefügt, nun gehts. Aber das FileInstall hab ich wieder rausgeschmissen. Dauert einfach zu lange.