Deutsch
Forum

DIE DATEI GEHÖRT MIR!

 
- Seite 1 -


Hallo Profaner...

Ich habe vor, mich demnächst mal etwas mäher mit der NT/NTFS File-Security zu beschäftigen - anzeigen und ändern von Eigentümern und son Zeug zum Beispiel. Hat jemand so etwas schon mal gemacht (mit Security Descriptors gearbeitet) oder gibt es Interesse an dem Thema?
 
11.04.2005  
 



 
- Seite 5 -



CB
Einfach auf den Link Sysinternals klicken in meinem vorigen Posting.
Das andere muß ich in Ruhe checken - bin bissel im Streß momentan.
Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
26.04.2005  
 



Das Privileg SeSecurityPrivilege scheint man nur für den Zugriff auf den SACL zu benötigen. Ich habe diesen Zugriff wahlweise abschaltbar gemacht und der Quelltext dürfte nun auch auf Profiles mit eingeschränkten Rechten laufen.

Das Auslesen des SACLs habe ich ebenfalls eingebaut. Wenn ich es richtig verstanden habe, zeichnet das System, je nach den Einträgen hier, erfolgreiche oder nicht erfolgreiche Zugriffe auf (=> Ereignisverfolgung).
KompilierenMarkierenSeparieren
Windowstyle 31+512
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
DEF @SetLastError(1) !"KERNEL32","SetLastError"
DEF @LookupPrivilegeName(4)!"advapi32","LookupPrivilegeNameA" Ermittelt aus dem Luid eines Privilegs dessen Namen.
DEF @LookupPrivilegeValue(3) !"advapi32","LookupPrivilegeValueA" Ermittelt aus dem Namen eines Privilegs dessen Luid.
DEF @OpenProcessToken(3) !"advapi32","OpenProcessToken" Öffnet Einstellprozess.
DEF @AdjustTokenPrivileges(6) !"advapi32","AdjustTokenPrivileges" Stellt Privilegien ein.
DEF @GetCurrentProcess(0) !"kernel32","GetCurrentProcess" Ermittel das Handle des aktiven Prozesses.
DEF @CloseHandle(1) !"kernel32","CloseHandle" Schließt ein Handle (Programm).
Def @GetVolumeInformation(8) !"KERNEL32","GetVolumeInformationA"
DEF @GetSecurityDescriptorOwner(3) !"ADVAPI32","GetSecurityDescriptorOwner"
DEF @GetSecurityDescriptorGroup(3) !"ADVAPI32","GetSecurityDescriptorGroup"
DEF @GetSecurityDescriptorDACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @GetSecurityDescriptorSACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @LookupAccountSid(7) !"ADVAPI32","LookupAccountSidA"
DEF @IsValidSecurityDescriptor(1) !"ADVAPI32","IsValidSecurityDescriptor"
DEF @IsValidSid(1) !"ADVAPI32","IsValidSid"
DEF @IsValidAcl(1) !"ADVAPI32","IsValidAcl"
DEF @GetAclInformation(4) !"ADVAPI32","GetAclInformation"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
DEF @GetAce(3) !"ADVAPI32","GetAce"
DEF @ConvertSidToStringSid(2) !"ADVAPI32","ConvertSidToStringSidA"
DEF @LocalFree(1) !"KERNEL32","LocalFree"
Declare Filename$,Fehler&,PSECURITY_DESCRIPTOR#,Needed#,Needed&
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
DEclare SID#,GFLAG#
DEclare ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#
Declare Test&
Declare ACL_PRESENT#,P_ACL#,ACL_D#
Declare ACL_INFO#,Zähler&,ACE#,P_ACE#,ACE_SIZE&,STRSID#,P_STRSID#
Declare SID2#,IO%,ADDR_NEWSTATE&,PrivCheckBox&,Start&,SecFlag&
LET PrivCheckBox&=@CreateCheckBox(%HWND,"Zugriff auf SACL und Eigentümer ermöglichen!",10,200,350,30)
LET Start&=@CreateButton(%HWND,"Programm starten",10,250,200,30)

Whilenot @Getfocus(Start&)

    Waitinput
    CASE %MENUITEM=-2 : end

WEND

EnableWindow PrivCheckBox&,0
EnableWindow Start&,0
LET Filename$=@LOADFILE$("Datei laden","Alle Dateien |*.*|Textdateien|*.TXT")

IF Filename$<>""

    CLEARLIST
    LET LAUFWERK$=@LEFT$(Filename$,3)
    DIM Label#,256
    DIM LFLAGS#,4
    DIM DAT#,256
    DIM STRSID#,256
    DIM P_STRSID#,4
    ADDSTRING "Gewählte Datei="+Filename$
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET FEHLER&=@GetVolumeInformation(@ADDR(Laufwerk$),Label#,256,0,0,LFlags#,DAT#,256)
    ADDSTRING "Rückgabe von GetVolumeInformation="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Laufwerksflags="+@BIN$(@LONG(LFLAGS#,0))

    IF @LONG(LFLAGS#,0) | $8 = @LONG(LFLAGS#,0)

        ADDSTRING "Zugriff ist einschränkbar"

    else

        ADDSTRING "Zugriff ist nicht einschränkbar"

    endif

    ADDSTRING "Ausgelesene Partition="+@String$(Dat#,0)
    dim token#,4
    DIM NewState#,16
    DIM Luid#,8
    DIM Privileg#,33
    ADDSTRING "Windowsversion="+$WINVER

    IF @Getcheck(PrivCheckBox&)

        ADDSTRING "Privilegien werden gesetzt!"
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        LET FEHLER&=@OpenProcessToken(@GetCurrentProcess(),$0020 | $0008,Token#)
        ADDSTRING "Rückgabe von OpenProcessToken="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeSecurityPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue für SeSecurityPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear NewState#
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeTakeOwnershipPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue fur SeTakeOwnershipPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT

    else

        ADDSTRING "Privilegien werden nicht!"

    endif

    DIM Needed#,4
    Clear Needed#

    IF @Getcheck(PrivCheckbox&)

        LET SECFLAG&=$1 | $2 | $4 | $8

    else

        LET SECFLAG&=$1 | $2 | $4

    endif

    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SecFlag&,0,0,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET NEEDED&=@LONG(Needed#,0)
    ADDSTRING "Erforderliche Länge des Security Descriptor="+@STR$(Needed&)
    CASE NEEDED&=0 : LET NEEDED&=1024
    DIM PSECURITY_DESCRIPTOR#,Needed&
    Clear PSECURITY_DESCRIPTOR#
    @SetLastError(0)
    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),$1 | $2 | $4,PSECURITY_DESCRIPTOR#,NEEDED&,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR#)
    ADDSTRING "Rückgabe von IsValidSecurityDescriptor="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM SID#,4
    DIM GFlag#,4
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorOwner="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für den Besitzer="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM ACCOUNT_NAME#,256
    DIM SIZE_ACCOUNT#,4
    DIM Domain#,256
    DIM SIZE_DOMAIN#,4
    DIM SID_NAME_USE#,4
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Besitzer der Datei="+@String$(ACCOUNT_NAME#,0)
    Clear STRSID#

    IF @VAL(@LEFT$($WINVER,3))>=5.0

        LET FEHLER&=@ConvertSidToStringSid(@Long(SID#,0),P_STRSID#)
        @CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
        ADDSTRING "String-SID des Besitzers="+@STRING$(STRSID#,0)
        ADDSTRING "Rückgabe von ConvertSidToStringSid="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    LET Fehler&=@LocalFree(@LONG(P_STRSID#,0))
    ADDSTRING "Rückgabe von LocalFree für den String-SID="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorGroup="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für die primäre Gruppe="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Primäre Gruppe der Datei="+@String$(ACCOUNT_NAME#,0)
    DIM ACL_PRESENT#,1
    DIM P_ACL#,4
    DIM ACL_D#,4
    Let Fehler&=@GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorDacl="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
    ADDSTRING "Rückgabe von IsValidAcl für den DACL="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    IF Fehler&=1

        DIM ACL_INFO#,12
        DIM P_ACE#,4
        CLEAR ACL_INFO#
        Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
        ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "ACEs in DACL="+@STR$(@LONG(ACL_INFO#,0))
        LET Zähler&=0

        IF @STR$(@LONG(ACL_INFO#,0))<>0

            While Zähler&<@LONG(ACL_INFO#,0)

                Clear P_ACE#
                Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                DIM ACE#,4
                Clear ACE#
                @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                LET ACE_SIZE&=@Word(ACE#,2)
                ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                IF @BYTE(ACE#,0)=0

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=1

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=2

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=3

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                endif

                Dispose ACE#
                DIM ACE#,ACE_SIZE&
                Clear SID_NAME_USE#
                Clear ACCOUNT_NAME#
                Clear Domain#
                Clear ACE#
                Long SIZE_ACCOUNT#,0=255
                LONG SIZE_DOMAIN#,0=255
                @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                DIM SID2#,ACE_SIZE&-8
                @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                @SetLastError(0)
                LET IO%=%IORESULT
                ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                ADDSTRING "Accessrechte des "+@STR$(Zähler&)+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                LET Zähler&=Zähler&+1
                Dispose SID2#
                Dispose ACE#

            wend

        Endif

        Dispose P_ACE#
        Dispose ACL_INFO#

    Endif

    IF @Getcheck(PrivCheckbox&)

        Let Fehler&=@GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        ADDSTRING "Rückgabe von GetSecurityDescriptorSacl="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
        ADDSTRING "Rückgabe von IsValidAcl für den SACL="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

        IF Fehler&=1

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#
            Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
            ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
            ADDSTRING "ACEs in SACL="+@STR$(@LONG(ACL_INFO#,0))
            LET Zähler&=0

            IF @STR$(@LONG(ACL_INFO#,0))<>0

                While Zähler&<@LONG(ACL_INFO#,0)

                    Clear P_ACE#
                    Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                    IF @BYTE(ACE#,0)=0

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=1

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=2

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=3

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                    endif

                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear SID_NAME_USE#
                    Clear ACCOUNT_NAME#
                    Clear Domain#
                    Clear ACE#
                    Long SIZE_ACCOUNT#,0=255
                    LONG SIZE_DOMAIN#,0=255
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                    @SetLastError(0)
                    LET IO%=%IORESULT
                    ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                    ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                    ADDSTRING "Accessrechte des "+@STR$(Zähler&)+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                    LET Zähler&=Zähler&+1
                    Dispose SID2#
                    Dispose ACE#

                wend

            Endif

            Dispose ACL_INFO#
            Dispose P_ACE#

        Endif

    endif

    IF @Getcheck(PrivCheckbox&)

        LET FEHLER&=@CloseHandle(@LONG(Token#,0))
        ADDSTRING "Rückgabe von CloseHandle="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    Dispose ACL_D#
    Dispose P_ACL#
    Dispose ACL_PRESENT#
    Dispose SID_NAME_USE#
    Dispose ACCOUNT_NAME#
    Dispose SIZE_ACCOUNT#
    Dispose Domain#
    Dispose SIZE_DOMAIN#
    Dispose SID#
    Dispose GFLAG#
    Dispose Luid#
    Dispose Privileg#
    Dispose NewState#
    Dispose token#
    Dispose Needed#
    Dispose PSECURITY_DESCRIPTOR#
    Dispose Label#
    Dispose LFlags#
    DISPOSE DAT#
    Dispose STRSID#
    Dispose P_STRSID#
    @Editbox("API Rückgaben",1)

Endif

Whilenot %MENUITEM=-2

    Waitinput

Wend


Ich werde mich doch erst um das Entschlüsseln der Rechte kümmer, dann sieht man besser, was in den einzelnen ACEs überhaupt steht.
 
26.04.2005  
 




CB
Hallo, Andreas!
Habe jetzt auf allen 3 PCs jeweils beide Varianten durchprobiert. Damit der thread nicht unnötig lang wird, als Dateianhänge (Bezeichnungen sollten selbsterklärend sein)
Bezüglich der Benutzergruppen: Die in der Reg. zu finden, ist ja kein Problem, nur habe ich keine Möglichkeit gefunden, die irgendwie aufzulisten - leider.
Erstmals keine Fehlermeldung mehr auf dem Firmen-PC.
Christian

 
XProfan 8/9.1, Win XP, AMD 64/3200
26.04.2005  
 



Hallo Christian...

Wunderbar! So solls sein. Damit steht auch fest, woher die Fehlermeldung gekommen ist - Needed& war 0 und dann wurde der Security Descriptor mit 0 Bytes dimensioniert.

Wenn du mir genau sagst, wie ich in der Registry an alle Gruppen komme, schreibe ich das Programm dazu - OK?
 
26.04.2005  
 




CB
Hallo nochmal!
Ich glaube, ich kann Dir einiges an Tipparbeit ersparen:
Gib mal in Regedit als Suchbegriff hivelist ein und gehe weiter bis zu CurrentControlSet
Das ist unter XP UND NT gleich...

Bis später,
Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
26.04.2005  
 




CB
Noch eine kurze Anmerkung zu TokenMon: Unter XP ist das wahrscheinlich der schnellste Weg, einen sofortigen Neustart auszulösen - ich hab mal ausprobiert, obs nicht doch unter XP läuft ...
Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
26.04.2005  
 



Hier erst einmal die Aufschlüsselung der Rechte:
KompilierenMarkierenSeparieren
Windowstyle 31+512
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
DEF @SetLastError(1) !"KERNEL32","SetLastError"
DEF @LookupPrivilegeName(4)!"advapi32","LookupPrivilegeNameA" Ermittelt aus dem Luid eines Privilegs dessen Namen.
DEF @LookupPrivilegeValue(3) !"advapi32","LookupPrivilegeValueA" Ermittelt aus dem Namen eines Privilegs dessen Luid.
DEF @OpenProcessToken(3) !"advapi32","OpenProcessToken" Öffnet Einstellprozess.
DEF @AdjustTokenPrivileges(6) !"advapi32","AdjustTokenPrivileges" Stellt Privilegien ein.
DEF @GetCurrentProcess(0) !"kernel32","GetCurrentProcess" Ermittel das Handle des aktiven Prozesses.
DEF @CloseHandle(1) !"kernel32","CloseHandle" Schließt ein Handle (Programm).
Def @GetVolumeInformation(8) !"KERNEL32","GetVolumeInformationA"
DEF @GetSecurityDescriptorOwner(3) !"ADVAPI32","GetSecurityDescriptorOwner"
DEF @GetSecurityDescriptorGroup(3) !"ADVAPI32","GetSecurityDescriptorGroup"
DEF @GetSecurityDescriptorDACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @GetSecurityDescriptorSACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @LookupAccountSid(7) !"ADVAPI32","LookupAccountSidA"
DEF @IsValidSecurityDescriptor(1) !"ADVAPI32","IsValidSecurityDescriptor"
DEF @IsValidSid(1) !"ADVAPI32","IsValidSid"
DEF @IsValidAcl(1) !"ADVAPI32","IsValidAcl"
DEF @GetAclInformation(4) !"ADVAPI32","GetAclInformation"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
DEF @GetAce(3) !"ADVAPI32","GetAce"
DEF @ConvertSidToStringSid(2) !"ADVAPI32","ConvertSidToStringSidA"
DEF @LocalFree(1) !"KERNEL32","LocalFree"
Declare Filename$,Fehler&,PSECURITY_DESCRIPTOR#,Needed#,Needed&
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
DEclare SID#,GFLAG#
DEclare ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#
Declare Test&
Declare ACL_PRESENT#,P_ACL#,ACL_D#
Declare ACL_INFO#,Zähler&,ACE#,P_ACE#,ACE_SIZE&,STRSID#,P_STRSID#
Declare SID2#,IO%,ADDR_NEWSTATE&,PrivCheckBox&,Start&,SecFlag&,ACCESS_MASK&
LET PrivCheckBox&=@CreateCheckBox(%HWND,"Zugriff auf SACL und Eigentümer ermöglichen!",10,200,350,30)
LET Start&=@CreateButton(%HWND,"Programm starten",10,250,200,30)

Whilenot @Getfocus(Start&)

    Waitinput
    CASE %MENUITEM=-2 : end

WEND

EnableWindow PrivCheckBox&,0
EnableWindow Start&,0
LET Filename$=@LOADFILE$("Datei laden","Alle Dateien |*.*|Textdateien|*.TXT")

IF Filename$<>""

    CLEARLIST
    LET LAUFWERK$=@LEFT$(Filename$,3)
    DIM Label#,256
    DIM LFLAGS#,4
    DIM DAT#,256
    DIM STRSID#,256
    DIM P_STRSID#,4
    ADDSTRING "Gewählte Datei="+Filename$
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET FEHLER&=@GetVolumeInformation(@ADDR(Laufwerk$),Label#,256,0,0,LFlags#,DAT#,256)
    ADDSTRING "Rückgabe von GetVolumeInformation="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Laufwerksflags="+@BIN$(@LONG(LFLAGS#,0))

    IF @LONG(LFLAGS#,0) | $8 = @LONG(LFLAGS#,0)

        ADDSTRING "Zugriff ist einschränkbar"

    else

        ADDSTRING "Zugriff ist nicht einschränkbar"

    endif

    ADDSTRING "Ausgelesene Partition="+@String$(Dat#,0)
    dim token#,4
    DIM NewState#,16
    DIM Luid#,8
    DIM Privileg#,33
    ADDSTRING "Windowsversion="+$WINVER

    IF @Getcheck(PrivCheckBox&)

        ADDSTRING "Privilegien werden gesetzt!"
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        LET FEHLER&=@OpenProcessToken(@GetCurrentProcess(),$0020 | $0008,Token#)
        ADDSTRING "Rückgabe von OpenProcessToken="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeSecurityPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue für SeSecurityPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear NewState#
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeTakeOwnershipPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue fur SeTakeOwnershipPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT

    else

        ADDSTRING "Privilegien werden nicht!"

    endif

    DIM Needed#,4
    Clear Needed#

    IF @Getcheck(PrivCheckbox&)

        LET SECFLAG&=$1 | $2 | $4 | $8

    else

        LET SECFLAG&=$1 | $2 | $4

    endif

    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SecFlag&,0,0,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET NEEDED&=@LONG(Needed#,0)
    ADDSTRING "Erforderliche Länge des Security Descriptor="+@STR$(Needed&)
    CASE NEEDED&=0 : LET NEEDED&=1024
    DIM PSECURITY_DESCRIPTOR#,Needed&
    Clear PSECURITY_DESCRIPTOR#
    @SetLastError(0)
    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),$1 | $2 | $4,PSECURITY_DESCRIPTOR#,NEEDED&,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR#)
    ADDSTRING "Rückgabe von IsValidSecurityDescriptor="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM SID#,4
    DIM GFlag#,4
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorOwner="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für den Besitzer="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM ACCOUNT_NAME#,256
    DIM SIZE_ACCOUNT#,4
    DIM Domain#,256
    DIM SIZE_DOMAIN#,4
    DIM SID_NAME_USE#,4
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Besitzer der Datei="+@String$(ACCOUNT_NAME#,0)
    Clear STRSID#

    IF @VAL(@LEFT$($WINVER,3))>=5.0

        LET FEHLER&=@ConvertSidToStringSid(@Long(SID#,0),P_STRSID#)
        @CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
        ADDSTRING "String-SID des Besitzers="+@STRING$(STRSID#,0)
        ADDSTRING "Rückgabe von ConvertSidToStringSid="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    LET Fehler&=@LocalFree(@LONG(P_STRSID#,0))
    ADDSTRING "Rückgabe von LocalFree für den String-SID="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorGroup="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für die primäre Gruppe="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Primäre Gruppe der Datei="+@String$(ACCOUNT_NAME#,0)
    DIM ACL_PRESENT#,1
    DIM P_ACL#,4
    DIM ACL_D#,4
    Let Fehler&=@GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorDacl="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
    ADDSTRING "Rückgabe von IsValidAcl für den DACL="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    IF Fehler&=1

        DIM ACL_INFO#,12
        DIM P_ACE#,4
        CLEAR ACL_INFO#
        Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
        ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "ACEs in DACL="+@STR$(@LONG(ACL_INFO#,0))
        LET Zähler&=0

        IF @STR$(@LONG(ACL_INFO#,0))<>0

            While Zähler&<@LONG(ACL_INFO#,0)

                Clear P_ACE#
                Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                DIM ACE#,4
                Clear ACE#
                @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                LET ACE_SIZE&=@Word(ACE#,2)
                ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                IF @BYTE(ACE#,0)=0

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=1

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=2

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=3

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                endif

                Dispose ACE#
                DIM ACE#,ACE_SIZE&
                Clear SID_NAME_USE#
                Clear ACCOUNT_NAME#
                Clear Domain#
                Clear ACE#
                Long SIZE_ACCOUNT#,0=255
                LONG SIZE_DOMAIN#,0=255
                @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                DIM SID2#,ACE_SIZE&-8
                @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                @SetLastError(0)
                LET IO%=%IORESULT
                ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                ADDSTRING "Accessrechte des "+@STR$(@int(Zähler&+1))+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                LET ACCESS_MASK&=@LONG(ACE#,4)

                IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS (Vollzugriff)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                endif

                IF @or(ACCESS_MASK&,$1)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_DATA (Erlaubt Daten aus einem File zu lesen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1

                endif

                IF @or(ACCESS_MASK&,$2)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_DATA (Erlaubt Daten zu Scheiben)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$2

                endif

                IF @or(ACCESS_MASK&,$4)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_APPEND_DATA (Erlaubt Daten anzuhängen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$4

                endif

                IF @or(ACCESS_MASK&,$8)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_EA (Erlaubt erweiterte Attibute zu lesen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$8

                endif

                IF @or(ACCESS_MASK&,$10)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_EA (Erlaubt erweiterte Attribute zu schreiben)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$10

                endif

                IF @or(ACCESS_MASK&,$20)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_EXECUTE (Erlaubt eine Datei auszuführen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$20

                endif

                IF @or(ACCESS_MASK&,$80)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_ATTRIBUTES (Lesen der Fileattribute)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80

                endif

                IF @or(ACCESS_MASK&,$100)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_ATTRIBUTES (Ändern der Fileattribute)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$100

                endif

                IF @or(ACCESS_MASK&,$00040000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_DAC (Ändern der DACL Einträge)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00040000

                endif

                IF @or(ACCESS_MASK&,$00020000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=READ_CONTROL (Lesen der DACL Einträge und Besitzer)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00020000

                endif

                IF @or(ACCESS_MASK&,$00100000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=SYNCHRONIZE (Erlaubt einem FileHandle auf ein Complitition I/O zu warten)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00100000

                endif

                IF @or(ACCESS_MASK&,$40)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=File_Delete _Child (Erlaubt einen Unterordner zu löschen - für Dateien keine Bedeutung)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$40

                endif

                IF @or(ACCESS_MASK&,$01000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=ACCESS_SYSTEM_SECURITY (Erlaubt den Zugriff auf den SACL)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$01000000

                endif

                IF @or(ACCESS_MASK&,$10000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_ALL"
                    LET ACCESS_MASK&=ACCESS_MASK&-$10000000

                endif

                IF @or(ACCESS_MASK&,$20000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_EXECUTE"
                    LET ACCESS_MASK&=ACCESS_MASK&-$20000000

                endif

                IF @or(ACCESS_MASK&,$40000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_WRITE"
                    LET ACCESS_MASK&=ACCESS_MASK&-$40000000

                endif

                IF @or(ACCESS_MASK&,$80000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_READ"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80000000

                endif

                IF @or(ACCESS_MASK&,$80000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_OWNER (Eigentümer ändern)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80000

                endif

                IF @or(ACCESS_MASK&,$00010000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=_DELETE (Datei löschen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00010000

                endif

                IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                endif

                IF ACCESS_MASK&>0

                    ADDSTRING "Nicht berechnete Rechte="+@STR$(ACCESS_MASK&)+" ($"+@HEX$(ACCESS_MASK&)+")"

                endif

                LET Zähler&=Zähler&+1
                Dispose SID2#
                Dispose ACE#

            wend

        Endif

        Dispose P_ACE#
        Dispose ACL_INFO#

    Endif

    IF @Getcheck(PrivCheckbox&)

        Let Fehler&=@GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        ADDSTRING "Rückgabe von GetSecurityDescriptorSacl="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
        ADDSTRING "Rückgabe von IsValidAcl für den SACL="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

        IF Fehler&=1

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#
            Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
            ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
            ADDSTRING "ACEs in SACL="+@STR$(@LONG(ACL_INFO#,0))
            LET Zähler&=0

            IF @STR$(@LONG(ACL_INFO#,0))<>0

                While Zähler&<@LONG(ACL_INFO#,0)

                    Clear P_ACE#
                    Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                    IF @BYTE(ACE#,0)=0

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=1

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=2

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=3

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                    endif

                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear SID_NAME_USE#
                    Clear ACCOUNT_NAME#
                    Clear Domain#
                    Clear ACE#
                    Long SIZE_ACCOUNT#,0=255
                    LONG SIZE_DOMAIN#,0=255
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                    @SetLastError(0)
                    LET IO%=%IORESULT
                    ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                    ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                    ADDSTRING "Accessrechte des "+@STR$(@int(Zähler&+1))+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                    LET ACCESS_MASK&=@LONG(ACE#,4)

                    IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS (Vollzugriff)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                    endif

                    IF @or(ACCESS_MASK&,$1)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_DATA (Erlaubt Daten aus einem File zu lesen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$1

                    endif

                    IF @or(ACCESS_MASK&,$2)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_DATA (Erlaubt Daten zu Scheiben)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$2

                    endif

                    IF @or(ACCESS_MASK&,$4)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_APPEND_DATA (Erlaubt Daten anzuhängen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$4

                    endif

                    IF @or(ACCESS_MASK&,$8)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_EA (Erlaubt erweiterte Attibute zu lesen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$8

                    endif

                    IF @or(ACCESS_MASK&,$10)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_EA (Erlaubt erweiterte Attribute zu schreiben)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$10

                    endif

                    IF @or(ACCESS_MASK&,$20)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_EXECUTE (Erlaubt eine Datei auszuführen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$20

                    endif

                    IF @or(ACCESS_MASK&,$80)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_ATTRIBUTES (Lesen der Fileattribute)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80

                    endif

                    IF @or(ACCESS_MASK&,$100)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_ATTRIBUTES (Ändern der Fileattribute)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$100

                    endif

                    IF @or(ACCESS_MASK&,$00040000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_DAC (Ändern der DACL Einträge)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00040000

                    endif

                    IF @or(ACCESS_MASK&,$00020000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=READ_CONTROL (Lesen der DACL Einträge und Besitzer)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00020000

                    endif

                    IF @or(ACCESS_MASK&,$00100000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=SYNCHRONIZE (Erlaubt einem FileHandle auf ein Complitition I/O zu warten)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00100000

                    endif

                    IF @or(ACCESS_MASK&,$40)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=File_Delete _Child (Erlaubt einen Unterordner zu löschen - für Dateien keine Bedeutung)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$40

                    endif

                    IF @or(ACCESS_MASK&,$01000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=ACCESS_SYSTEM_SECURITY (Erlaubt den Zugriff auf den SACL)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$01000000

                    endif

                    IF @or(ACCESS_MASK&,$10000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_ALL"
                        LET ACCESS_MASK&=ACCESS_MASK&-$10000000

                    endif

                    IF @or(ACCESS_MASK&,$20000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_EXECUTE"
                        LET ACCESS_MASK&=ACCESS_MASK&-$20000000

                    endif

                    IF @or(ACCESS_MASK&,$40000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_WRITE"
                        LET ACCESS_MASK&=ACCESS_MASK&-$40000000

                    endif

                    IF @or(ACCESS_MASK&,$80000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_READ"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80000000

                    endif

                    IF @or(ACCESS_MASK&,$80000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_OWNER (Eigentümer ändern)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80000

                    endif

                    IF @or(ACCESS_MASK&,$00010000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=_DELETE (Datei löschen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00010000

                    endif

                    IF ACCESS_MASK&>0

                        ADDSTRING "Nicht berechnete Rechte="+@STR$(ACCESS_MASK&)+" ($"+@HEX$(ACCESS_MASK&)+")"

                    endif

                    LET Zähler&=Zähler&+1
                    Dispose SID2#
                    Dispose ACE#

                wend

            Endif

            Dispose ACL_INFO#
            Dispose P_ACE#

        Endif

    endif

    IF @Getcheck(PrivCheckbox&)

        LET FEHLER&=@CloseHandle(@LONG(Token#,0))
        ADDSTRING "Rückgabe von CloseHandle="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    Dispose ACL_D#
    Dispose P_ACL#
    Dispose ACL_PRESENT#
    Dispose SID_NAME_USE#
    Dispose ACCOUNT_NAME#
    Dispose SIZE_ACCOUNT#
    Dispose Domain#
    Dispose SIZE_DOMAIN#
    Dispose SID#
    Dispose GFLAG#
    Dispose Luid#
    Dispose Privileg#
    Dispose NewState#
    Dispose token#
    Dispose Needed#
    Dispose PSECURITY_DESCRIPTOR#
    Dispose Label#
    Dispose LFlags#
    DISPOSE DAT#
    Dispose STRSID#
    Dispose P_STRSID#
    @Editbox("API Rückgaben",1)

Endif

Whilenot %MENUITEM=-2

    Waitinput

Wend


Unter dem von dir angegebenen Schlüssel finde ich bei mir leider keine Gruppen. GroupMembership gibts bei mir aber auch...
 
27.04.2005  
 




CB
In GroupMenbership stehen die auf dem System möglichen Arten von Anwendern, zB S-1-5-32-544 für Admins, die übrigen Einträge konnte ich noch nicht eindeutig zuordnen, sind aber Benutzer, Hauptbenutzer etc.
In der hivelist findest du unter \REGISTRY\USER\.. die bisher auf dem System angemeldeten Benutzer.

Nun zu den heutigen Resultaten: es tut sich einiges

Soll ich die Test in dieser Art weiterführen oder irgendetwas weglassen?

 
XProfan 8/9.1, Win XP, AMD 64/3200
27.04.2005  
 



Hallo Christian...

Sieht super aus - so wollte ich es haben.

Das Betriebsystem macht beim öffnen einer Datei folgendes (ich erklärs mal anhand der API CreateFile):
- In Parameter 2 von CreateFile müssen Accessrechte angegeben werden - das sind genau die Rechte, das sind genau diese Rechte, die du unter ACEs hier in den Quelltextrückgaben siehst.
- Es werden dann die ACES des DACLs des Users überprüft, der das Handle der Datei öffnen will.
- Wenn bei einem ACCESS_ALLOWED_ACE_TYPE alle Rechte in den Flags vorhanden sind, wird der Zugriff erlaubt.
- Wenn bei einem ACCESS_DENIED_ACE_TYPE ein angefragtes Recht vorhanden ist, wird der Zugriff verweigert.
- Die SACLs dienen nur der Überwachung des Systems.
- Bei einem ACCESS_ALLOWED_ACE_TYPE wird jeder erlaubte Zugriff registriert.
- Bei einem ACCESS_DENIED_ACE_TYPE wird jeder abgelehnte Zugriff registriert.

Das was wir hier erarbeiten gilt nicht nur für Files, sondern für fast alle Handles (siehe API RegOpenKeyEx oder auch CreateFileMapping!) .
Ich will mal hoffen, daß das alles stimmt, was ich da so von mir gelassen habe - ich bin selbst alles andere als ein Experte.

Alles was jetzt an Quelltext nachfolgt, darf nicht mehr auf den Firmenrechnern getestet werden - jetzt gehts ans Ändern der Rechte.

Bitte erstelle extra dafür eine Textdatei - keine sonstigen Dateien vom Computer nehmen.

Da ich ab heute wieder zur Nachtschicht gehe, kanns etwas dauern, bis es weitergeht...
 
27.04.2005  
 




CB
OK - alles klar!

Ciao, Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
27.04.2005  
 



Hallo Profaner...

Ich habe mir beim Auslesen des SACLs ein paar Fehler eingebaut, die hoffentlich jetzt im unteren Quelltext korrigiert sind.

Um einen Eintrag (also einen ACE) in einem ACL hinzuzufügen, muß man einen kompletten ACL selbst erstellen.
Das braucht doch etws mehr Zeit und wird etwas komplizierter als ich vorher gedacht habe - dürfte aber auch kein großes Problem werden.
Ich muß mich erst einmal um eine genaue Größenberechnung für den selbsterzeugten ACL kümmern - bis hier was brauchbares zum Setzen von Rechten steht, wird es also wohl noch etwas dauern...
KompilierenMarkierenSeparieren
Windowstyle 31+512
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
DEF @SetLastError(1) !"KERNEL32","SetLastError"
DEF @LookupPrivilegeName(4)!"advapi32","LookupPrivilegeNameA" Ermittelt aus dem Luid eines Privilegs dessen Namen.
DEF @LookupPrivilegeValue(3) !"advapi32","LookupPrivilegeValueA" Ermittelt aus dem Namen eines Privilegs dessen Luid.
DEF @OpenProcessToken(3) !"advapi32","OpenProcessToken" Öffnet Einstellprozess.
DEF @AdjustTokenPrivileges(6) !"advapi32","AdjustTokenPrivileges" Stellt Privilegien ein.
DEF @GetCurrentProcess(0) !"kernel32","GetCurrentProcess" Ermittel das Handle des aktiven Prozesses.
DEF @CloseHandle(1) !"kernel32","CloseHandle" Schließt ein Handle (Programm).
Def @GetVolumeInformation(8) !"KERNEL32","GetVolumeInformationA"
DEF @GetSecurityDescriptorOwner(3) !"ADVAPI32","GetSecurityDescriptorOwner"
DEF @GetSecurityDescriptorGroup(3) !"ADVAPI32","GetSecurityDescriptorGroup"
DEF @GetSecurityDescriptorDACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @GetSecurityDescriptorSACL(4) !"ADVAPI32","GetSecurityDescriptorSacl"
DEF @LookupAccountSid(7) !"ADVAPI32","LookupAccountSidA"
DEF @IsValidSecurityDescriptor(1) !"ADVAPI32","IsValidSecurityDescriptor"
DEF @IsValidSid(1) !"ADVAPI32","IsValidSid"
DEF @IsValidAcl(1) !"ADVAPI32","IsValidAcl"
DEF @GetAclInformation(4) !"ADVAPI32","GetAclInformation"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
DEF @GetAce(3) !"ADVAPI32","GetAce"
DEF @ConvertSidToStringSid(2) !"ADVAPI32","ConvertSidToStringSidA"
DEF @LocalFree(1) !"KERNEL32","LocalFree"
Declare Filename$,Fehler&,PSECURITY_DESCRIPTOR#,Needed#,Needed&
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
DEclare SID#,GFLAG#
DEclare ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#
Declare Test&
Declare ACL_PRESENT#,P_ACL#,ACL_D#
Declare ACL_INFO#,Zähler&,ACE#,P_ACE#,ACE_SIZE&,STRSID#,P_STRSID#
Declare SID2#,IO%,ADDR_NEWSTATE&,PrivCheckBox&,Start&,SecFlag&,ACCESS_MASK&
LET PrivCheckBox&=@CreateCheckBox(%HWND,"Zugriff auf SACL und Eigentümer ermöglichen!",10,200,350,30)
LET Start&=@CreateButton(%HWND,"Programm starten",10,250,200,30)

Whilenot @Getfocus(Start&)

    Waitinput
    CASE %MENUITEM=-2 : end

WEND

EnableWindow PrivCheckBox&,0
EnableWindow Start&,0
LET Filename$=@LOADFILE$("Datei laden","Alle Dateien |*.*|Textdateien|*.TXT")

IF Filename$<>""

    CLEARLIST
    LET LAUFWERK$=@LEFT$(Filename$,3)
    DIM Label#,256
    DIM LFLAGS#,4
    DIM DAT#,256
    DIM STRSID#,256
    DIM P_STRSID#,4
    ADDSTRING "Gewählte Datei="+Filename$
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET FEHLER&=@GetVolumeInformation(@ADDR(Laufwerk$),Label#,256,0,0,LFlags#,DAT#,256)
    ADDSTRING "Rückgabe von GetVolumeInformation="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Laufwerksflags="+@BIN$(@LONG(LFLAGS#,0))

    IF @LONG(LFLAGS#,0) | $8 = @LONG(LFLAGS#,0)

        ADDSTRING "Zugriff ist einschränkbar"

    else

        ADDSTRING "Zugriff ist nicht einschränkbar"

    endif

    ADDSTRING "Ausgelesene Partition="+@String$(Dat#,0)
    dim token#,4
    DIM NewState#,16
    DIM Luid#,8
    DIM Privileg#,33
    ADDSTRING "Windowsversion="+$WINVER

    IF @Getcheck(PrivCheckBox&)

        ADDSTRING "Privilegien werden gesetzt!"
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        LET FEHLER&=@OpenProcessToken(@GetCurrentProcess(),$0020 | $0008,Token#)
        ADDSTRING "Rückgabe von OpenProcessToken="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeSecurityPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue für SeSecurityPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        Clear NewState#
        Long NewState#,0=1 Nur ein Privileg soll geändert werden
        Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
        Clear Privileg#
        Clear LUID#
        STRING Privileg#,0="SeTakeOwnershipPrivilege"
        LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
        ADDSTRING "Rückgabe von LookupPrivilegeValue fur SeTakeOwnershipPrivilege="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT
        LET ADDR_NEWSTATE&=NewState#
        LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
        @CopyMemory(ADDR_NEWSTATE&,Luid#,8)
        ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
        Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
        ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "Reset des API-Fehlers wird durchgeführt"
        @SetLastError(0)
        LET IO%=%IORESULT

    else

        ADDSTRING "Privilegien werden nicht!"

    endif

    DIM Needed#,4
    Clear Needed#

    IF @Getcheck(PrivCheckbox&)

        LET SECFLAG&=$1 | $2 | $4 | $8

    else

        LET SECFLAG&=$1 | $2 | $4

    endif

    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SecFlag&,0,0,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET NEEDED&=@LONG(Needed#,0)
    ADDSTRING "Erforderliche Länge des Security Descriptor="+@STR$(Needed&)
    CASE NEEDED&=0 : LET NEEDED&=1024
    DIM PSECURITY_DESCRIPTOR#,Needed&
    Clear PSECURITY_DESCRIPTOR#
    @SetLastError(0)
    LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SECFLAG&,PSECURITY_DESCRIPTOR#,NEEDED&,Needed#)
    ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR#)
    ADDSTRING "Rückgabe von IsValidSecurityDescriptor="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM SID#,4
    DIM GFlag#,4
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorOwner="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für den Besitzer="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    DIM ACCOUNT_NAME#,256
    DIM SIZE_ACCOUNT#,4
    DIM Domain#,256
    DIM SIZE_DOMAIN#,4
    DIM SID_NAME_USE#,4
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Besitzer der Datei="+@String$(ACCOUNT_NAME#,0)
    Clear STRSID#

    IF @VAL(@LEFT$($WINVER,3))>=5.0

        LET FEHLER&=@ConvertSidToStringSid(@Long(SID#,0),P_STRSID#)
        @CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
        ADDSTRING "String-SID des Besitzers="+@STRING$(STRSID#,0)
        ADDSTRING "Rückgabe von ConvertSidToStringSid="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    LET Fehler&=@LocalFree(@LONG(P_STRSID#,0))
    ADDSTRING "Rückgabe von LocalFree für den String-SID="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Clear SID_NAME_USE#
    Clear ACCOUNT_NAME#
    Clear Domain#
    Clear SID#
    Clear GFLAG#
    LET FEHLER&=@GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorGroup="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidSid(@long(SID#,0))
    ADDSTRING "Rückgabe von IsValidSid für die primäre Gruppe="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    Long SIZE_ACCOUNT#,0=255
    LONG SIZE_DOMAIN#,0=255
    LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
    @SetLastError(0)
    LET IO%=%IORESULT
    ADDSTRING "Domainname="+@String$(Domain#,0)
    ADDSTRING "Primäre Gruppe der Datei="+@String$(ACCOUNT_NAME#,0)
    DIM ACL_PRESENT#,1
    DIM P_ACL#,4
    DIM ACL_D#,4
    Let Fehler&=@GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
    ADDSTRING "Rückgabe von GetSecurityDescriptorDacl="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
    ADDSTRING "Rückgabe von IsValidAcl für den DACL="+@STR$(Fehler&)
    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
    LET FEHLER&=@LONG(ACL_PRESENT#,0)

    IF Fehler&=1

        DIM ACL_INFO#,12
        DIM P_ACE#,4
        CLEAR ACL_INFO#
        Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
        ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        ADDSTRING "ACEs in DACL="+@STR$(@LONG(ACL_INFO#,0))
        LET Zähler&=0

        IF @STR$(@LONG(ACL_INFO#,0))<>0

            While Zähler&<@LONG(ACL_INFO#,0)

                Clear P_ACE#
                Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                DIM ACE#,4
                Clear ACE#
                @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                LET ACE_SIZE&=@Word(ACE#,2)
                ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                IF @BYTE(ACE#,0)=0

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=1

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=2

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                ElseIF @BYTE(ACE#,0)=3

                    ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                endif

                Dispose ACE#
                DIM ACE#,ACE_SIZE&
                Clear SID_NAME_USE#
                Clear ACCOUNT_NAME#
                Clear Domain#
                Clear ACE#
                Long SIZE_ACCOUNT#,0=255
                LONG SIZE_DOMAIN#,0=255
                @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                DIM SID2#,ACE_SIZE&-8
                @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                @SetLastError(0)
                LET IO%=%IORESULT
                ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                ADDSTRING "Accessrechte des "+@STR$(@int(Zähler&+1))+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                LET ACCESS_MASK&=@LONG(ACE#,4)

                IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS (Vollzugriff)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                endif

                IF @or(ACCESS_MASK&,$1)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_DATA (Erlaubt Daten aus einem File zu lesen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1

                endif

                IF @or(ACCESS_MASK&,$2)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_DATA (Erlaubt Daten zu Scheiben)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$2

                endif

                IF @or(ACCESS_MASK&,$4)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_APPEND_DATA (Erlaubt Daten anzuhängen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$4

                endif

                IF @or(ACCESS_MASK&,$8)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_EA (Erlaubt erweiterte Attibute zu lesen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$8

                endif

                IF @or(ACCESS_MASK&,$10)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_EA (Erlaubt erweiterte Attribute zu schreiben)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$10

                endif

                IF @or(ACCESS_MASK&,$20)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_EXECUTE (Erlaubt eine Datei auszuführen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$20

                endif

                IF @or(ACCESS_MASK&,$80)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_ATTRIBUTES (Lesen der Fileattribute)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80

                endif

                IF @or(ACCESS_MASK&,$100)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_ATTRIBUTES (Ändern der Fileattribute)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$100

                endif

                IF @or(ACCESS_MASK&,$00040000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_DAC (Ändern der DACL Einträge)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00040000

                endif

                IF @or(ACCESS_MASK&,$00020000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=READ_CONTROL (Lesen der DACL Einträge und Besitzer)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00020000

                endif

                IF @or(ACCESS_MASK&,$00100000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=SYNCHRONIZE (Erlaubt einem FileHandle auf ein Complitition I/O zu warten)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00100000

                endif

                IF @or(ACCESS_MASK&,$40)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=File_Delete _Child (Erlaubt einen Unterordner zu löschen - für Dateien keine Bedeutung)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$40

                endif

                IF @or(ACCESS_MASK&,$01000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=ACCESS_SYSTEM_SECURITY (Erlaubt den Zugriff auf den SACL)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$01000000

                endif

                IF @or(ACCESS_MASK&,$10000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_ALL"
                    LET ACCESS_MASK&=ACCESS_MASK&-$10000000

                endif

                IF @or(ACCESS_MASK&,$20000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_EXECUTE"
                    LET ACCESS_MASK&=ACCESS_MASK&-$20000000

                endif

                IF @or(ACCESS_MASK&,$40000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_WRITE"
                    LET ACCESS_MASK&=ACCESS_MASK&-$40000000

                endif

                IF @or(ACCESS_MASK&,$80000000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_READ"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80000000

                endif

                IF @or(ACCESS_MASK&,$80000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_OWNER (Eigentümer ändern)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$80000

                endif

                IF @or(ACCESS_MASK&,$00010000)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=_DELETE (Datei löschen)"
                    LET ACCESS_MASK&=ACCESS_MASK&-$00010000

                endif

                IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                    ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS"
                    LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                endif

                IF ACCESS_MASK&>0

                    ADDSTRING "Nicht berechnete Rechte="+@STR$(ACCESS_MASK&)+" ($"+@HEX$(ACCESS_MASK&)+")"

                endif

                LET Zähler&=Zähler&+1
                Dispose SID2#
                Dispose ACE#

            wend

        Endif

        Dispose P_ACE#
        Dispose ACL_INFO#

    Endif

    IF @Getcheck(PrivCheckbox&)

        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let Fehler&=@GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        ADDSTRING "Rückgabe von GetSecurityDescriptorSacl="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
        ADDSTRING "Rückgabe von IsValidAcl für den SACL="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
        LET FEHLER&=@LONG(ACL_PRESENT#,0)

        IF Fehler&=1

            ADDSTRING "SACL ist vorhanden!"
            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
            ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
            ADDSTRING "ACEs in SACL="+@STR$(@LONG(ACL_INFO#,0))
            LET Zähler&=0

            IF @STR$(@LONG(ACL_INFO#,0))<>0

                While Zähler&<@LONG(ACL_INFO#,0)

                    Clear P_ACE#
                    Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))

                    IF @BYTE(ACE#,0)=0

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=1

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=2

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"

                    ElseIF @BYTE(ACE#,0)=3

                        ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"

                    endif

                    IF @or(@BYTE(ACE#,1),$40)=@BYTE(ACE#,1)

                        ADDSTRING @STR$(@INT(Zähler&+1))+".ACE zeichnet erfolgreiche Zugriffe auf."

                    Elseif @or(@BYTE(ACE#,1),$80)=@BYTE(ACE#,1)

                        ADDSTRING @STR$(@INT(Zähler&+1))+".ACE zeichnet fehlgeschlagene Zugriffe auf."

                    endif

                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear SID_NAME_USE#
                    Clear ACCOUNT_NAME#
                    Clear Domain#
                    Clear ACE#
                    Long SIZE_ACCOUNT#,0=255
                    LONG SIZE_DOMAIN#,0=255
                    @CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    @CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
                    ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
                    ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
                    ADDSTRING "Reset des API-Fehlers wird durchgeführt"
                    @SetLastError(0)
                    LET IO%=%IORESULT
                    ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
                    ADDSTRING @STR$(@int(Zähler&+1))+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
                    ADDSTRING "Accessrechte des "+@STR$(@int(Zähler&+1))+". ACEs=$"+@HEX$(@LONG(ACE#,4))
                    LET ACCESS_MASK&=@LONG(ACE#,4)

                    IF @or(ACCESS_MASK&,$1F01FF)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_ALL_ACCESS (Vollzugriff)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$1F01FF

                    endif

                    IF @or(ACCESS_MASK&,$1)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_DATA (Erlaubt Daten aus einem File zu lesen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$1

                    endif

                    IF @or(ACCESS_MASK&,$2)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_DATA (Erlaubt Daten zu Scheiben)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$2

                    endif

                    IF @or(ACCESS_MASK&,$4)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_APPEND_DATA (Erlaubt Daten anzuhängen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$4

                    endif

                    IF @or(ACCESS_MASK&,$8)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_EA (Erlaubt erweiterte Attibute zu lesen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$8

                    endif

                    IF @or(ACCESS_MASK&,$10)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_EA (Erlaubt erweiterte Attribute zu schreiben)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$10

                    endif

                    IF @or(ACCESS_MASK&,$20)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_EXECUTE (Erlaubt eine Datei auszuführen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$20

                    endif

                    IF @or(ACCESS_MASK&,$80)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_READ_ATTRIBUTES (Lesen der Fileattribute)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80

                    endif

                    IF @or(ACCESS_MASK&,$100)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=FILE_WRITE_ATTRIBUTES (Ändern der Fileattribute)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$100

                    endif

                    IF @or(ACCESS_MASK&,$00040000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_DAC (Ändern der DACL Einträge)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00040000

                    endif

                    IF @or(ACCESS_MASK&,$00020000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=READ_CONTROL (Lesen der DACL Einträge und Besitzer)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00020000

                    endif

                    IF @or(ACCESS_MASK&,$00100000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=SYNCHRONIZE (Erlaubt einem FileHandle auf ein Complitition I/O zu warten)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00100000

                    endif

                    IF @or(ACCESS_MASK&,$40)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=File_Delete _Child (Erlaubt einen Unterordner zu löschen - für Dateien keine Bedeutung)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$40

                    endif

                    IF @or(ACCESS_MASK&,$01000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=ACCESS_SYSTEM_SECURITY (Erlaubt den Zugriff auf den SACL)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$01000000

                    endif

                    IF @or(ACCESS_MASK&,$10000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_ALL"
                        LET ACCESS_MASK&=ACCESS_MASK&-$10000000

                    endif

                    IF @or(ACCESS_MASK&,$20000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_EXECUTE"
                        LET ACCESS_MASK&=ACCESS_MASK&-$20000000

                    endif

                    IF @or(ACCESS_MASK&,$40000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_WRITE"
                        LET ACCESS_MASK&=ACCESS_MASK&-$40000000

                    endif

                    IF @or(ACCESS_MASK&,$80000000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=GENERIC_READ"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80000000

                    endif

                    IF @or(ACCESS_MASK&,$80000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=WRITE_OWNER (Eigentümer ändern)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$80000

                    endif

                    IF @or(ACCESS_MASK&,$00010000)=ACCESS_MASK&

                        ADDSTRING "Recht im "+@STR$(@int(Zähler&+1))+". ACE=_DELETE (Datei löschen)"
                        LET ACCESS_MASK&=ACCESS_MASK&-$00010000

                    endif

                    IF ACCESS_MASK&>0

                        ADDSTRING "Nicht berechnete Rechte="+@STR$(ACCESS_MASK&)+" ($"+@HEX$(ACCESS_MASK&)+")"

                    endif

                    LET Zähler&=Zähler&+1
                    Dispose SID2#
                    Dispose ACE#

                wend

            Endif

            Dispose ACL_INFO#
            Dispose P_ACE#

        Endif

    else

        ADDSTRING "SACL ist nicht vorhanden!"

    endif

    IF @Getcheck(PrivCheckbox&)

        LET FEHLER&=@CloseHandle(@LONG(Token#,0))
        ADDSTRING "Rückgabe von CloseHandle="+@STR$(Fehler&)
        ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())

    endif

    Dispose ACL_D#
    Dispose P_ACL#
    Dispose ACL_PRESENT#
    Dispose SID_NAME_USE#
    Dispose ACCOUNT_NAME#
    Dispose SIZE_ACCOUNT#
    Dispose Domain#
    Dispose SIZE_DOMAIN#
    Dispose SID#
    Dispose GFLAG#
    Dispose Luid#
    Dispose Privileg#
    Dispose NewState#
    Dispose token#
    Dispose Needed#
    Dispose PSECURITY_DESCRIPTOR#
    Dispose Label#
    Dispose LFlags#
    DISPOSE DAT#
    Dispose STRSID#
    Dispose P_STRSID#
    @Editbox("API Rückgaben",1)

Endif

Whilenot %MENUITEM=-2

    Waitinput

Wend

 
07.05.2005  
 




CB
Hallo Andreas!
Hier mal die Resultate mit XP_SP2:
MIT Zugriff:
[box:0a77cbaa7b]Gewählte Datei=D:Server97Vorlagen97GUTACHTEN- Pulmo97.dot
Letzter API-Fehler=0
Rückgabe von GetVolumeInformation=1
Letzter API-Fehler=0
Laufwerksflags=1110000000011111111
Zugriff ist einschränkbar
Ausgelesene Partition=NTFS
Windowsversion=5.1
Privilegien werden gesetzt!
Rückgabe von OpenProcessToken=1
Letzter API-Fehler=0
Rückgabe von LookupPrivilegeValue für SeSecurityPrivilege=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Letzter API-Fehler nach CopyMemory=0
Rückgabe von AdjustTokenPrivileges=1
Letzter API-Fehler=0
Rückgabe von LookupPrivilegeValue fur SeTakeOwnershipPrivilege=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Letzter API-Fehler nach CopyMemory=0
Rückgabe von AdjustTokenPrivileges=1
Letzter API-Fehler=0
Reset des API-Fehlers wird durchgeführt
Rückgabe von GetFileSecurity=0
Letzter API-Fehler=122
Erforderliche Länge des Security Descriptor=104
Rückgabe von GetFileSecurity=1
Letzter API-Fehler=0
Rückgabe von IsValidSecurityDescriptor=1
Letzter API-Fehler=0
Rückgabe von GetSecurityDescriptorOwner=1
Letzter API-Fehler=0
Rückgabe von IsValidSid für den Besitzer=1
Letzter API-Fehler=0
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Domainname=MMC3
Besitzer der Datei=CB
String-SID des Besitzers=S-1-5-21-1417001333-1004336348-682003330-1003
Rückgabe von ConvertSidToStringSid=1
Letzter API-Fehler=0
Rückgabe von LocalFree für den String-SID=0
Letzter API-Fehler=0
Rückgabe von GetSecurityDescriptorGroup=1
Letzter API-Fehler=0
Rückgabe von IsValidSid für die primäre Gruppe=1
Letzter API-Fehler=0
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Domainname=MMC3
Primäre Gruppe der Datei=Kein
Rückgabe von GetSecurityDescriptorDacl=1
Letzter API-Fehler=0
Rückgabe von IsValidAcl für den DACL=1
Letzter API-Fehler=0
Rückgabe von GetAclInformation=1
Letzter API-Fehler=0
ACEs in DACL=1
Größe des 1.ACEs=20
ACE Typ des 1.ACEs=ACCESS_ALLOWED_ACE_TYPE
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
1. ACE Bezogen auf SID=Jeder
1. ACE Bezogen auf Domainname=
Accessrechte des 1. ACEs=$1F01FF
Recht im 1. ACE=FILE_ALL_ACCESS (Vollzugriff)
Rückgabe von GetSecurityDescriptorSacl=1
Letzter API-Fehler=0
Rückgabe von IsValidAcl für den SACL=0
Letzter API-Fehler=1336
Rückgabe von CloseHandle=1
Letzter API-Fehler=0[/box:0a77cbaa7b]
OHNE Zugriff:
[box:0a77cbaa7b]Gewählte Datei=D:Server97Vorlagen97GUTACHTEN- Pulmo97.dot
Letzter API-Fehler=0
Rückgabe von GetVolumeInformation=1
Letzter API-Fehler=0
Laufwerksflags=1110000000011111111
Zugriff ist einschränkbar
Ausgelesene Partition=NTFS
Windowsversion=5.1
Privilegien werden nicht!
Rückgabe von GetFileSecurity=0
Letzter API-Fehler=122
Erforderliche Länge des Security Descriptor=104
Rückgabe von GetFileSecurity=1
Letzter API-Fehler=0
Rückgabe von IsValidSecurityDescriptor=1
Letzter API-Fehler=0
Rückgabe von GetSecurityDescriptorOwner=1
Letzter API-Fehler=0
Rückgabe von IsValidSid für den Besitzer=1
Letzter API-Fehler=0
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Domainname=MMC3
Besitzer der Datei=CB
String-SID des Besitzers=S-1-5-21-1417001333-1004336348-682003330-1003
Rückgabe von ConvertSidToStringSid=1
Letzter API-Fehler=0
Rückgabe von LocalFree für den String-SID=0
Letzter API-Fehler=0
Rückgabe von GetSecurityDescriptorGroup=1
Letzter API-Fehler=0
Rückgabe von IsValidSid für die primäre Gruppe=1
Letzter API-Fehler=0
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
Domainname=MMC3
Primäre Gruppe der Datei=Kein
Rückgabe von GetSecurityDescriptorDacl=1
Letzter API-Fehler=0
Rückgabe von IsValidAcl für den DACL=1
Letzter API-Fehler=0
Rückgabe von GetAclInformation=1
Letzter API-Fehler=0
ACEs in DACL=1
Größe des 1.ACEs=20
ACE Typ des 1.ACEs=ACCESS_ALLOWED_ACE_TYPE
Rückgabe von LookupAccountSid=1
Letzter API-Fehler=997
Reset des API-Fehlers wird durchgeführt
1. ACE Bezogen auf SID=Jeder
1. ACE Bezogen auf Domainname=
Accessrechte des 1. ACEs=$1F01FF
Recht im 1. ACE=FILE_ALL_ACCESS (Vollzugriff)
SACL ist nicht vorhanden![/box:0a77cbaa7b]
NT folgt Montag
Christian
 
XProfan 8/9.1, Win XP, AMD 64/3200
07.05.2005  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.637 Betrachtungen

Unbenanntvor 0 min.
JR04.11.2014
Tommy30.01.2014
Andreas Koch05.09.2013
Stephie03.09.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie