Bild in ein geschütztes Verzeichnis kopieren

  • Hallo Zusammen,

    ich habe folgendes Problem:
    Ich möchte gerne ein Bild in ein Verzeichnis kopieren lassen in dem der User eigentlich keinen Schreibzugriff hat.
    Jetzt habe ich folgendes Probiert:

    [autoit]

    Local $UserName = "Administrator"
    Local $Password = "Passwort1"
    Local $Password2 = "Passwort2"

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

    MsgBox(0, "User-Bild ändern", "Das User-Bild wird geändert")
    $Fehler=RunAs($UserName, @ComputerName, $Password, 0, FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 9))
    If $Fehler = 0 Then
    RunAs($UserName, @ComputerName, $Password2, 0, FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 9))
    EndIf
    If FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 1) Then MsgBox(0, 'FileCopy', 'Kopiervorgang erfolgreich')

    [/autoit]

    Es wird mir zwar in der MsgBox zurückgegeben, dass das Bild kopiert wurde, was aber nicht stimmt.
    Ich habe jetzt nicht so vile Ahnung vom Programieren oder von Autoit, deswegen ersuche ich eure Hilfe.

    Übrigens, gesucht habe ich auch schon und habe diverse Dinge probiert, die aber nicht funktionieren.

    Vielleicht hat jemand einen Tipp für mich.

    Danke

    Einmal editiert, zuletzt von Rigibid (27. Februar 2014 um 11:40)

    • Offizieller Beitrag

    Also RunAs mit AutoIt Befehlen wird nicht funktionieren, denke ich.
    Du musst entweder deine Skript als Admin ausführen.
    Siehe : #RequireAdmin

    Oder ein Programm (z.B. eine exe Datei) per RunAs ausrufen.

    Das zweite wäre glaube ich für dich am einfachsten.

    Also eine AutoScript.exe erstellen, die einfach nur das Kopieren macht.
    Dann eine Zweite, die die erste mit RunAs ... aufruft.

  • Hi,

    die gegebene Idee ist: Du machst zwei Programme.

    Weil die berechtigte Vermutung ist, das Du mit RunAs keine Auto-IT Befehle aufrufen kannst :
    RunAs([...] , FileCopy[...])
    Wäre aber der von Dir benutzte Befehl "FileCopy" ein zweites Programm (eine .exe), dann würde dieses als Admin ausgeführt werden :)

    => Zwei Programme schreiben, das erste ist "die User GUI" das zweite das eigentliche Arbeitstier :)

    René

  • So,
    hab ich gemacht.
    Bringt mir keinerlei Fehlermeldung, macht aber auch nicht was es soll.
    Ich denke es liegt an der speziellen Berechtigung des Ordner, weil der Benutzer kein schreibrecht hat.
    Anscheinend funktioniert das mit dem Admin-Mitgeben nicht, warum auch immer.

    Scheint wohl Pech zu sein.

  • Wenn der User-Admin Schreibberechtigung hat, sollte m.E. in seinem Kontext gestarteter Copy-Befehl auch funktionieren.

    Nur mal so, um das Problem zu zerlegen ein paar Fragen/Gegenproben:
    - das zu kopierende File liegt im selben Verzeichnis wie Dein Programm und würde auch erfolgreich nach %tmp% , bzw. @TempDir kopiert werden?
    - wird ein RunAs ... DirCreate("C:\ProgramData\Microsoft\User Account Pictures\test") erfolgreich ausgeführt werden
    - Die Hilfe sagt folgendes zur Syntax von Filecopy:

    Code
    FileCopy ( "source", "dest" [, flag] )


    Für Flag gilt: 0 = (default) do not overwrite existing files
    - der Benutzer "Administrator" ist nicht zufällig teil einer Domäne und müsste evtl. mit <Domäne>\Administrator aufgerufen werden oder <Computername>\Administrator?
    - ...

    Einmal editiert, zuletzt von ReneW (26. Februar 2014 um 15:24) aus folgendem Grund: LinksSchreibFehler korrigiert.

  • Also,
    der Admin hat natürlich Schreibberechtigung.
    Wenn ich mich anmelde (ich bin Admin) funktioniert es.

    Ich muß allerding hinzufügen, dass wir hier ein Novell-Netzwerk haben, also ist nix mit Domäne.

    Die AutoIt-Datei liegt im gleichen Verzeichnis wie die Bild-Datei.

    Der Ziel-Pfad ist auch vorhanden (es ist ein Standard-Pfad von Win7).

    Und ja, die existierende Date soll überschrieben werden.
    Das Bild ist ein Standard-Bild beim anmelden am Computer (nicht im Netzwerk).
    Falls mal das Netzwerk nicht vorhanden sein sollte, bekommt man das Standard-Bild.
    Und das haben wir geändert, weil wir dem Benutzer einen Hinweis geben wollen.

    Wie gesagt, wenn ich mich anmelde geht es.

    Es liegt also nur daran, dass der Benutzer kein Schreibrecht in diesem Verzeichnis hat.
    Und diese AutoIt-Einträge die eigentlich den Admin mitgeben sollte funktioniert nicht.

    Ich habe jetzt eine Notlösung:
    Wir benutzen DameWare.
    Und darüber kann ich dieses Bild in die jeweiligen Ordner reinkopieren.

    Also erst mal vielen Dank für die nützlichen Hinweise.

  • hallo,

    habe noch folgenden code für dich!
    diesen an den anfang vom script setzen ....damit sollte das ganze script als anderer user starten, wenn deiser keine admin rechte hat

    [autoit]


    If Not IsAdmin() Then
    ; AB Version 3.2.12.0
    RunAs("admin", @LogonDomain, "adminpwd", 0, @ScriptFullPath, @ScriptDir, @SW_HIDE)
    Exit
    EndIf

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

    If IsAdmin() Then
    ;MsgBox(0, "", "Admin-Rechte erkannt.",1)
    EndIf

    [/autoit]

    gruß gmmg

  • Hallo gmmg,

    kurzer Bericht.

    Also vom Netzlaufwerk hat es nicht funktioniert.
    Aber lokal funktioniert es schon mal.

    Ich werde jetzt folgendes tun.
    Ich werde ein script schreiben (oder zumindest versuchen) in dem ich die Dateien auf ein lokale Laufwerk kopieren lasse,
    und dieses dann von dort aus starte.
    Das müsste ja funktionieren.

    Schaun mer mal.

    Danke erst einmal.

    Werde dann nochmal berichten.

  • Zur Info!

    Ich habe jetzt folgendes gemacht:

    Datei1:

    Spoiler anzeigen
    [autoit]

    Local $UserName = "Administrator"
    Local $Password = "Passwort1"
    Local $Password2 = "Passwort2"
    Local $ScriptDir = "C:\Temp\User-Bild"
    Local $Program = $ScriptDir & "\User.exe"
    Local $workingdir = "C:\Temp\User-Bild"
    Local $Fehler = 0

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

    DirCreate($ScriptDir)
    FileCopy("Verzeichnis von dem kopiert wird\user.*", $ScriptDir, 9)
    $Fehler=RunAs($UserName, @ComputerName, $Password, 0, $Program, $workingdir)
    If $Fehler = 0 Then
    RunAs($UserName, @ComputerName, $Password2, 0, $Program, $workingdir)
    EndIf

    [/autoit]

    Datei2:

    Spoiler anzeigen
    [autoit]

    If Not IsAdmin() Then
    ; AB Version 3.2.12.0
    RunAs("Administrator", @LogonDomain, "Passwort", 0, @ScriptFullPath, @ScriptDir, @SW_HIDE)
    Exit
    EndIf

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

    If IsAdmin() Then
    MsgBox(0, "Admin-Rechte", "Admin-Rechte erkannt.",1)
    EndIf

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

    Local $UserName = "Administrator"
    Local $Password = "Passwort1"
    Local $Password2 = "Passwort2"
    Local $ScriptDir = "C:\Temp\User-Bild"

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

    MsgBox(0, "User-Bild ändern", "Das User-Bild wird geändert",1)
    $Fehler=RunAs($UserName, @ComputerName, $Password, 0, FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 9))
    If $Fehler = 0 Then
    RunAs($UserName, @ComputerName, $Password2, 0, FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 9))
    EndIf
    If FileCopy("user.bmp", "C:\ProgramData\Microsoft\User Account Pictures\*.*", 1) Then MsgBox(0, "FileCopy", "Kopiervorgang erfolgreich",1)

    [/autoit]

    Damit hat es funktioniert.