English
Source / code snippets

Reading Token Zugriffsrechte

 
Folgender code throws a look on The Zugriffsrechte one Token:
CompileMarkSeparation
Windowstyle 31+512
Windowtitle Token Security
Window 0,0-640,440
DEF @GetKernelObjectSecurity(5) !ADVAPI32,GetKernelObjectSecurity
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#,Privileg#,Luid#,System$
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&,Token&
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
CLEARLIST
DIM STRSID#,256
DIM P_STRSID#,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(),$20 | $0008,@addr(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(Token&,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 für 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(Token&,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
    LET SECFLAG&=$1 | $2 | $4 | $8
    LET FEHLER&=@CloseHandle(Token&)
    ADDSTRING Rückgabe von CloseHandle=+@STR$(Fehler&)
    ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())

else

    ADDSTRING Privilegien werden nicht gesetzt!
    LET SECFLAG&=$1 | $2 | $4

endif

LET FEHLER&=@OpenProcessToken(@GetCurrentProcess(),$20000,@ADDR(Token&))
ADDSTRING Rückgabe von OpenProcessToken=+@STR$(Fehler&)
ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
DIM Needed#,4
Clear Needed#
LET Fehler&=@GetKernelObjectSecurity(Token&,SecFlag&,0,0,Needed#)
ADDSTRING Rückgabe von GetKernelObjectSecurity=+@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&=@GetKernelObjectSecurity(Token&,SECFLAG&,PSECURITY_DESCRIPTOR#,NEEDED&,Needed#)
ADDSTRING Rückgabe von GetKernelObjectSecurity=+@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#,2
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 des Tokens=+@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())
    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())

endif

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#,4
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 @LONG(ACL_PRESENT#,0)=1

    ADDSTRING DACL ist vorhanden!

else

    ADDSTRING DACL ist nicht vorhanden!

endif

IF @AND(Fehler&=1,@LONG(ACL_PRESENT#,0)=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 Anzahl benutzter Bytes in DACL=+@STR$(@LONG(ACL_INFO#,4))
    ADDSTRING Anzahl freier Bytes in DACL=+@STR$(@LONG(ACL_INFO#,8))
    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
            Clear STRSID#

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

                LET FEHLER&=@ConvertSidToStringSid(SID2#,P_STRSID#)
                @CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
                ADDSTRING Rückgabe von ConvertSidToStringSid=+@STR$(Fehler&)
                ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
                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())
                ADDSTRING String-SID des +@STR$(@int(Zähler&+1))+. ACEs=+@STRING$(STRSID#,0)

            endif

            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&,$1)=ACCESS_MASK&

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_ASSIGN_PRIMARY (Primären Token einem Prozess zuordnen)
                LET ACCESS_MASK&=ACCESS_MASK&-$1

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_DUPLICATE (Token dublizieren)
                LET ACCESS_MASK&=ACCESS_MASK&-$2

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_IMPERSONATE (Impersonation Token einem Prozess zuordnen)
                LET ACCESS_MASK&=ACCESS_MASK&-$4

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_QUERY (Inhalte eines Token abfragen)
                LET ACCESS_MASK&=ACCESS_MASK&-$8

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_QUERY_SOURCE (Quelle des Tokens abfragen)
                LET ACCESS_MASK&=ACCESS_MASK&-$10

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_ADJUST_PRIVILEGES (Privilegien aktivieren / deaktivieren)
                LET ACCESS_MASK&=ACCESS_MASK&-$20

            endif

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

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=TOKEN_ADJUST_DEFAULT (Default ACL setzen)
                LET ACCESS_MASK&=ACCESS_MASK&-$80

            endif

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

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

            endif

            IF @or(ACCESS_MASK&,$40000)=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&,$20000)=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&,$100000)=ACCESS_MASK&

                ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=SYNCHRONIZE (Erlaubt einem Handle 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=TOKEN_ADJUST_GROUPS (Gruppen im Token ändern)
                LET ACCESS_MASK&=ACCESS_MASK&-$40

            endif

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

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

            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&,$10000)=ACCESS_MASK&

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

            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())

    IF @LONG(ACL_PRESENT#,0)=1

        ADDSTRING SACL ist vorhanden!

    else

        ADDSTRING SACL ist nicht vorhanden!

    endif

    IF @AND(Fehler&=1,@LONG(ACL_PRESENT#,0)=1)

        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 Anzahl benutzter Bytes in SACL=+@STR$(@LONG(ACL_INFO#,4))
        ADDSTRING Anzahl freier Bytes in SACL=+@STR$(@LONG(ACL_INFO#,8))
        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
                Clear STRSID#

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

                    LET FEHLER&=@ConvertSidToStringSid(SID2#,P_STRSID#)
                    @CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
                    ADDSTRING Rückgabe von ConvertSidToStringSid=+@STR$(Fehler&)
                    ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
                    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())
                    ADDSTRING String-SID des +@STR$(@int(Zähler&+1))+. ACEs=+@STRING$(STRSID#,0)

                endif

                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

LET FEHLER&=@CloseHandle(Token&)
ADDSTRING Rückgabe von CloseHandle=+@STR$(Fehler&)
ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
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 Needed#
Dispose PSECURITY_DESCRIPTOR#
Dispose STRSID#
Dispose P_STRSID#
@Editbox(API Rückgaben,1)

Whilenot %MENUITEM=-2

    Waitinput

Wend

 
06/13/05  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

no Systemprofil laid out. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Please register circa a Posting To verfassen.
 

Topic-Options

2.649 Views

Untitledvor 0 min.
Ralf Netz05/15/13

Themeninformationen

this Topic has 1 subscriber:

unbekannt (1x)


Admins  |  AGB  |  Applications  |  Authors  |  Chat  |  Privacy Policy  |  Download  |  Entrance  |  Help  |  Merchantportal  |  Imprint  |  Mart  |  Interfaces  |  SDK  |  Services  |  Games  |  Search  |  Support

One proposition all XProfan, The there's!


My XProfan
Private Messages
Own Storage Forum
Topics-Remember-List
Own Posts
Own Topics
Clipboard
Log off
 Deutsch English Français Español Italia
Translations

Privacy Policy


we use Cookies only as Session-Cookies because of the technical necessity and with us there no Cookies of Drittanbietern.

If you here on our Website click or navigate, stimmst You ours registration of Information in our Cookies on XProfan.Net To.

further Information To our Cookies and moreover, How You The control above keep, find You in ours nachfolgenden Datenschutzerklärung.


all rightDatenschutzerklärung
i want none Cookie