Deutsch
Forum

HÄNDE WEG von meinem Schlüssel!

 
Moin alle zusammmen...

Längst nicht jeder User hat Zugriff auf alle Registryschlüssel - auch das ist beim Erstellen von Programmen zu bedenken. Vertraut also jemand darauf, daß ein User mit eingeschränkten Rechten ebenfalls alle Keys unter HKEY_LOCAL_MACHINE auslesen kann, könnte er da evtl. auf Sand gebaut haben.
Ich hab mal einen kleinen Quelltext zum Spielen geschrieben:
KompilierenMarkierenSeparieren
 $H WINDOWS.PH
Windowstyle 31+512
Windowtitle Registry Security
Window 0,0-640,440
DEF @RegCloseKey(1) !ADVAPI32,RegCloseKey
DEF @RegOpenKeyEx(5) !ADVAPI32,RegOpenKeyExA
DEF @RegGetKeySecurity(4) !ADVAPI32,RegGetKeySecurity
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 Fehler&,PSECURITY_DESCRIPTOR#,Needed#,Needed&
Declare NewState#,token#,Privileg#,Luid#,System$
DEclare SID#,GFLAG#
DEclare ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#
Declare Test&,RegHandle#,Key$,RegHandle&
Declare ACL_PRESENT#,P_ACL#,ACL_D#,Oberschlüssel&
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 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
DIM RegHandle#,4
Clear RegHandle#
LET Oberschlüssel&=~HKEY_LOCAL_MACHINE
LET KEY$=SoftwareMicrosoftWindows NTCurrentVersionProfileList
ADDSTRING Windowsversion=+$WINVER

IF @Getcheck(PrivCheckBox&)

    dim token#,4
    DIM NewState#,16
    DIM Luid#,8
    DIM Privileg#,33
    ADDSTRING Rückgabe von RegOpenKeyEx=+@STR$(Fehler&)
    ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
    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())
    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())
    Dispose Luid#
    Dispose Privileg#
    Dispose NewState#
    LET SECFLAG&=$1 | $2 | $4 | $8
    LET FEHLER&=@RegOpenKeyEx($80000002,@ADDR(KEY$),0,$F003F | $1000000,RegHandle#)

else

    ADDSTRING Privilegien werden nicht gesetzt!
    LET FEHLER&=@RegOpenKeyEx($80000002,@ADDR(KEY$),0,$F003F,RegHandle#)
    ADDSTRING Rückgabe von RegOpenKeyEx=+@STR$(Fehler&)
    ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())
    LET SECFLAG&=$1 | $2 | $4

endif

Let Reghandle&=@LONG(RegHandle#,0)

IF @AND(RegHandle&<>0,Fehler&=0)

    ADDSTRING Handle des abzufragenden Oberschlüssels=+@HEX$(Oberschlüssel&)
    ADDSTRING Abzufragender Schlüssel=+KEY$
    DIM Needed#,4
    DIM PSECURITY_DESCRIPTOR#,2048
    Long Needed#,0=2048
    LET Fehler&=@RegGetKeySecurity(RegHandle&,SecFlag&,0,Needed#)
    ADDSTRING Rückgabe von RegGetKeySecurity=+@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
    Dispose PSECURITY_DESCRIPTOR#
    DIM PSECURITY_DESCRIPTOR#,Needed&
    Clear PSECURITY_DESCRIPTOR#
    @SetLastError(0)
    LET Fehler&=@RegGetKeySecurity(RegHandle&,SECFLAG&,PSECURITY_DESCRIPTOR#,Needed#)
    ADDSTRING Rückgabe von RegGetKeySecurity=+@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 P_STRSID#,4
    DIM ACCOUNT_NAME#,256
    DIM SIZE_ACCOUNT#,4
    DIM Domain#,256
    DIM SIZE_DOMAIN#,4
    DIM SID_NAME_USE#,4
    DIM STRSID#,256
    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())
        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&,$1F01FF)=ACCESS_MASK&

                    ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=KEY_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=KEY_QUERY_VALUE (Erlaubt Daten aus einem Schlüssel 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=KEY_SET_VALUE (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=KEY_CREATE_SUB_KEY (Erlaubt Unterschlüssel zu erstellen)
                    LET ACCESS_MASK&=ACCESS_MASK&-$4

                endif

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

                    ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=KEY_ENUMERATE_SUB_KEYS (Erlaubt Unterschlüssel zu listen 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=KEY_NOTIFY
                    LET ACCESS_MASK&=ACCESS_MASK&-$10

                endif

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

                    ADDSTRING Recht im +@STR$(@int(Zähler&+1))+. ACE=KEY_CREATE_LINK (Erlaubt symbolischen Link zu erstellen)
                    LET ACCESS_MASK&=ACCESS_MASK&-$20

                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 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=KEY_DELETE_CHILD (Erlaubt einen Unterschlüssel 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 (Key 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=KEY_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())

        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

    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 token#
    Dispose Needed#
    Dispose PSECURITY_DESCRIPTOR#
    Dispose STRSID#
    Dispose P_STRSID#
    LET FEHLER&=@RegCloseKey(REGHANDLE&)
    ADDSTRING Rückgabe von RegCloseKey=+@STR$(Fehler&)
    ADDSTRING Letzter API-Fehler=+@STR$(@GetLastError())

Endif

@Editbox(API Rückgaben,1)
Dispose RegHandle#

Whilenot %MENUITEM=-2

    Waitinput

Wend


Welche Fragen habe ich:
- Ich arbeite in der Regel nur mit Windows95/98. Gibt es auf NT/2000/XP irgendwelche Systemprogramme, die diese Rechte in der Registry auflisten?
- Gibt es noch mehr Registryrechte als die, die ich im Quelltext berechnen lasse? Reine Kombinationsflags mal ausgenommen...
- Wird bei irgendeinem Registryschlüssel irgendwo ein SACL angezeigt?
- Hat irgendjemand Fragen zum Quelltext?
 
31.05.2005  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

706 Betrachtungen

Unbenanntvor 0 min.
Helmut17.07.2018

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

unbekannt (1x)


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