ACL mit-/kopieren

  • Gibt es eine Möglichkeit, unter AutoIt eine Ordnerstruktur bzw. eine Datei zu kopieren und die Quell-Zugriffsberechtigung (ACL, AccessControlList) mit zu übernehmen ?
    Oder nach dem FileCopy die Berechtigung nachträglich anzupassen ?

    Da es aber einige 1000 Dateien betreffen würde, kommt eigentlich eine Aufruf eines externen CMDLine-Tools nicht in Frage....
    Hat jemand eine andere Lösung (Win API, Win DLL) ? Nur schnell sollte sie sein !

    Danke
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Besteht unter Umständen die Möglichkeit auf die Funktionen "SetFileSecurity" und "GetFileSecurity" der ADVAPI32.DLL zuzugriefen und es damit zu lösen ?
    Ggf. auch Get-/SetNamedSecurityInfo der gleichen Bibliothek ? Ein kurze Bespiel in VB oder VBS habe ich leider nicht gefunden...

    Besten Dank nochmal

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hilfe !!!

    Ich habe mal den Anfang probiert. Aber DllCall ist mir scheinbar ainfach zu hoch...
    Warum bekomme ich bei meiner Umsetzung nix (aber auch gar nix) zurück ?

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Opt("MustDeclareVars",1)

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

    Const $OWNER_SECURITY_INFORMATION = 0x1
    Const $GROUP_SECURITY_INFORMATION = 0x2
    Const $DACL_SECURITY_INFORMATION = 0x4
    Dim $sFile, $hAdvapi32, $aSecu

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

    $sFile = @scriptfullpath
    ;$sFile = @scriptdir & "\dummy.txt"
    $hAdvapi32 = DllOpen("advapi32.dll")

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

    $aSecu = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "long", $DACL_SECURITY_INFORMATION, _
    "byte","", _
    "long",0, _
    "long",0)
    DllClose($hAdvapi32)

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

    _arrayDisplay($aSecu)

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Also, du bekommst nichts zurück, da der DLLcall einen Fehler hat -> kein REturn Array
    Das sollte gehen:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Opt("MustDeclareVars",1)

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

    Const $OWNER_SECURITY_INFORMATION = 0x1
    Const $GROUP_SECURITY_INFORMATION = 0x2
    Const $DACL_SECURITY_INFORMATION = 0x4
    Dim $sFile, $hAdvapi32, $aSecu

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

    ;~ $sFile = @scriptfullpath
    $sFile = "D:\Dokumente\Folien Kraftwerke.cdr"
    ;$sFile = @scriptdir & "\dummy.txt"
    $hAdvapi32 = DllOpen("advapi32.dll")

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

    $aSecu = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $DACL_SECURITY_INFORMATION, _
    "ptr",0, _
    "dword",0, _
    "dword*",0)
    Local $secDesc = DllStructCreate("byte[" & $aSecu[5] & "]")

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

    $aSecu = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $DACL_SECURITY_INFORMATION, _
    "ptr",DllStructGetPtr($secDesc), _
    "dword",DllStructGetSize($secDesc), _
    "dword*",0)

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

    _arrayDisplay($aSecu)
    MsgBox(0, '', DllStructGetData($secDesc,1))
    Local $ret = DllCall($hAdvapi32,"int","IsValidSecurityDescriptor","ptr",DllStructGetPtr($secDesc))
    MsgBox(0, '', "Security Desscriptor valid: " & $ret[0])
    Local $ret = DllCall($hAdvapi32,"long","GetSecurityDescriptorControl","ptr",DllStructGetPtr($secDesc),"ushort*",0,"int*",0)
    _arrayDisplay($ret)

    DllClose($hAdvapi32)

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

    MsgBox(0, DllStructGetData($secDesc,4), $sid)

    [/autoit]
  • Wie kann ich so etwas harausfinden, das die Funktion "Str, DWord, Ptr, Dword, Dword*" benötigt ?
    Gibt es da für AutoIt-User eine brauchbare Hilfe oder Webseite ?

    Oder eine Übersetzung? Laut MSDN sieht der Aufruf ja wie folgt aus:

    Spoiler anzeigen

    BOOL WINAPI GetFileSecurity(
    __in LPCTSTR lpFileName,
    __in SECURITY_INFORMATION RequestedInformation,
    __out_opt PSECURITY_DESCRIPTOR pSecurityDescriptor,
    __in DWORD nLength,
    __out LPDWORD lpnLengthNeeded
    );

    Wie komme ich von da aus, auf eine funktionierende AutoIt-Version, wie sie 'progandy' gezeigt hat ?!?

    @progandy: Danke aber für die Hilfe !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (27. Oktober 2008 um 23:51)

  • Also:
    LPCTSTR, LPCSTR char* und so sind str
    LPCWSTR , charw* und so sind wstr ;)
    sonst: Strukturen sind Pointer mit DLLStructGetptr
    LP... sachen und ...* sind ...*, also referenzen
    und sonst steht das meiste in der Hilfe bei DLLCall und DllstructCreate.

    Man muss nur noch rausfinden, ob z.B. SECURITY_INFORMATION, eine DLLStruct oder ein "normaler" Wert sein soll ( hier ist es ein normaler)

  • Nach anfänglicher Hilfe hier aus dem Forum, habe ich die benötigten Funktionen fertig.
    Unter Umständen besteht ja allgemeines Interesse...

    Spoiler anzeigen
    [autoit]

    ; Funktionen für das anpassen von Sicherheits- und Benutzereinstellungen
    ;
    ; _GetFileSecurityDACL($quelle) : Liest eine Beschreibung der Sicherheitsinfomationen
    ; _SetFileSecurityDACL($ziel, $beschreibung) : Setzt eine Beschreibung der Sicherheitsinfomationen
    ; _CopyFileSecurityDACL($quelle, $ziel) : Kopiert eine Beschreibung der Sicherheitsinfomationen
    ; _GetFileSecurityOWNER($quelle) : Liest eine Beschreibung der Besitzerinfomationen
    ; _SetFileSecurityOWNER($ziel) : Setzt eine Beschreibung der Besitzerinfomationen
    ; _CopyFileSecurityOWNER($quelle, $ziel) : Kopiert eine Beschreibung der Besitzerinfomationen
    ; _CheckSecurityDescriptor($beschreibung) : Prüft eine Beschreibung auf Gültigkeit

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

    Func _GetFileSecurityDACL($sFile)
    If Not IsDeclared("DACL_SECURITY_INFORMATION") Then Const $DACL_SECURITY_INFORMATION = 0x4
    Local $return
    Local $hAdvapi32 = DllOpen("advapi32.dll")
    If Not FileExists($sFile) Then Return SetError(1,0,0)
    $return = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $DACL_SECURITY_INFORMATION, _
    "ptr",0, _
    "dword",0, _
    "dword*",0)
    If Not $return[5] Then Return SetError(1,0,0)
    Local $strucSD = DllStructCreate("byte[" & $return[5] & "]")
    $return = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $DACL_SECURITY_INFORMATION, _
    "ptr",DllStructGetPtr($strucSD), _
    "dword",DllStructGetSize($strucSD), _
    "dword*",0)
    If Not $return[0] Then Return SetError(1,0,0)
    DllClose($hAdvapi32)
    Return DllStructGetData($strucSD,1)
    EndFunc

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

    Func _SetFileSecurityDACL($sFile,$Descriptor)
    If Not IsDeclared("DACL_SECURITY_INFORMATION") Then Const $DACL_SECURITY_INFORMATION = 0x4
    Local $strucSD = DllStructCreate("byte[" & (StringLen($descriptor)/2)-1 & "]")
    DllStructSetData($strucSD,1,$Descriptor)
    Local $hAdvapi32 = DllOpen("advapi32.dll")
    Local $return = DllCall($hAdvapi32,"long","SetFileSecurity", _
    "str",$sFile, _
    "dword", $DACL_SECURITY_INFORMATION, _
    "ptr",DllStructGetPtr($strucSD))
    DllClose($hAdvapi32)
    If $return[0] = 0 Then Return SetError(1,0,0)
    Return 1
    EndFunc

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

    Func _CopyFileSecurityDACL($sSFile, $sDFile)
    If Not _SetFileSecurityDACL($sDFile,_GetFileSecurityDACL($sSFile)) Then SetError(1,0,0)
    Return 1
    EndFunc

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

    Func _CheckSecurityDescriptor($Descriptor)
    Local $strucSD = DllStructCreate("byte[" & (StringLen($Descriptor)/2)-1 & "]")
    DllStructSetData($strucSD,1,$Descriptor)
    Local $hAdvapi32 = DllOpen("advapi32.dll")
    Local $return = DllCall($hAdvapi32,"int","IsValidSecurityDescriptor", _
    "ptr",DllStructGetPtr($strucSD))
    DllClose($hAdvapi32)
    If $return[0] = 0 Then Return SetError(1,0,0)
    Return 1
    EndFunc

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

    Func _GetFileSecurityOWNER($sFile)
    If Not IsDeclared("OWNER_SECURITY_INFORMATION") Then Const $OWNER_SECURITY_INFORMATION = 0x1
    Local $hAdvapi32 = DllOpen("advapi32.dll")
    Local $return = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $OWNER_SECURITY_INFORMATION, _
    "ptr",0, _
    "dword",0, _
    "dword*",0)
    Local $strucSD = DllStructCreate("byte[" & $return[5] & "]")
    $return = DllCall($hAdvapi32,"long","GetFileSecurity", _
    "str",$sFile, _
    "dword", $OWNER_SECURITY_INFORMATION, _
    "ptr",DllStructGetPtr($strucSD), _
    "dword",DllStructGetSize($strucSD), _
    "dword*",0)
    If Not $return[0] Then Return SetError(1,0,0)
    DllClose($hAdvapi32)
    Return DllStructGetData($strucSD,1)
    EndFunc

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

    Func _SetFileSecurityOWNER($sFile,$Descriptor)
    If Not IsDeclared("OWNER_SECURITY_INFORMATION") Then Const $OWNER_SECURITY_INFORMATION = 0x1
    Local $strucSD = DllStructCreate("byte[" & (StringLen($Descriptor)/2)-1 & "]")
    DllStructSetData($strucSD,1,$Descriptor)
    Local $hAdvapi32 = DllOpen("advapi32.dll")
    Local $return = DllCall($hAdvapi32,"long","SetFileSecurity", _
    "str",$sFile, _
    "dword", $OWNER_SECURITY_INFORMATION, _
    "ptr",DllStructGetPtr($strucSD))
    DllClose($hAdvapi32)
    If $return[0] = 0 Then Return SetError(1,0,0)
    Return 1
    EndFunc

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

    Func _CopyFileSecurityOWNER($sSFile, $sDFile)
    If Not _SetFileSecurityOWNER($sDFile,_GetFileSecurityOWNER($sSFile)) Then SetError(1,0,0)
    Return 1
    EndFunc

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • kann es sein, dass die UDF nicht richtig funktioniert? Es scheint mir so, als könnte man SetOwner nur auf den User ausführen, der grade eingeloggt ist - mit anderen Worten: man kann besitz nicht übertragen....

    habe extra nen 2. user angelegt sowie 2 dateien, die jeweils einem der beiden gehören - nun habe ich per script die Besitzrechte tauschen wollen, doch das hat nur bei dem einen file geklappt, dass zuvor dem nicht eingeloggten user gehörte....

    [autoit]


    $file = @workingdir & "\" & "1.txt"
    $file2 = @workingdir & "\" & "2.txt"

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

    $sid = _GetFileSecurityOWNER($file)
    $sid2 = _GetFileSecurityOWNER($file2)
    FileWrite ("sid1.txt",$sid)
    FileWrite ("sid2.txt",$sid2)

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

    _SetFileSecurityOWNER($file,$sid2)
    msgbox (0,"",@error)
    _SetFileSecurityOWNER($file2,$sid)
    msgbox (0,"",@error)

    [/autoit]
  • Du hast Recht !

    Obwohl die API-Funktion auch fremde User setzen können soll, funktioniert es nicht einwandfrei. Auch als Admin nicht !
    Ich schaue mal, ob ich das Problem lokalisieren kann...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"