Français
Comprend

Zugriffsrechte eines Prozesses mettons

 
un Ausschnitt aus qui DACL_SET.INC (SET_PROCESS_RIGHTS.INC):
KompilierenMarqueSéparation
DEF @AHGetWindowThreadProcessId(2) !USER32,GetWindowThreadProcessId
DEF @AHGetCurrentProcess(0) !KERNEL32,GetCurrentProcess
DEF @AHOpenProcess(3) !KERNEL32,OpenProcess
DEF @AHCloseHandle(1) !KERNEL32,CloseHandle
DEF @AHGetKernelObjectSecurity(5) !ADVAPI32,GetKernelObjectSecurity
DEF @AHSetKernelObjectSecurity(3) !ADVAPI32,SetKernelObjectSecurity
DEF @AHLookupAccountName(7) !advapi32,LookupAccountNameA
DEF @AHCopyMemory(3) !kernel32,RtlMoveMemory
DEF @AHInitializeSecurityDescriptor(2) !ADVAPI32,InitializeSecurityDescriptor
DEF @AHSetSecurityDescriptorDacl(4) !ADVAPI32,SetSecurityDescriptorDacl
DEF @AHAddAce(5) !ADVAPI32,AddAce
DEF @AHGetSecurityDescriptorOwner(3) !ADVAPI32,GetSecurityDescriptorOwner
DEF @AHGetSecurityDescriptorGroup(3) !ADVAPI32,GetSecurityDescriptorGroup
DEF @AHGetSecurityDescriptorDACL(4) !ADVAPI32,GetSecurityDescriptorDacl
DEF @AHLookupAccountSid(7) !ADVAPI32,LookupAccountSidA
DEF @AHIsValidAcl(1) !ADVAPI32,IsValidAcl
DEF @AHGetAclInformation(4) !ADVAPI32,GetAclInformation
DEF @AHGetAce(3) !ADVAPI32,GetAce
DEF @AHLocalFree(1) !KERNEL32,LocalFree
DEF @AHInitializeAcl(3) !ADVAPI32,InitializeAcl
Declare FILE_FEHLER&,CBNAME$
Declare SEC_ID#,CBNAME_SIZE#,CBNAME#
Declare SID#,F_PROC_SID_NAME_USE#
Declare Needed#,NEW_ACL1#,SIDA#
Declare STRSID#,ACL_INFO#,ACE#,P_ACE#,P_STRSID#
Declare SID2#,P_ACL#,ACL_D#
Declare PSECURITY_DESCRIPTOR#,ACL_PRESENT#
Declare F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#
Declare AHRechte$[36,2],F_PROC_Zähler2&

Proc Set_Process_ACE_IN_DACL

    Parameters F_PROC_Process$,F_PROC_USER$,Hinzu_entfernen$,FSFLAGS$
    Declare F_SYS$,Needed&
    Declare F_LAUFWERK$
    Declare FSFlags&
    Declare ANZAHL_BYTES&
    Declare F_PROC_Zähler&,ACE_SIZE&
    Declare IO%,SecFlag&,ACCESS_MASK&
    Declare Vorhanden&,SecFlag&,NEEDED&
    Declare ACE_ZÄHLER&,SIZE_ACCOUNT&
    Declare CFS$,PROCESS_ID&,THREAD_ID&,F_PROC_Process&,Ersatz$
    1.Parameter=
    Das Handle eines Prozesses als String,
    der Titel eines Fensters
    oder ein Leerstring für den aktuellen Prozess
    2.Parameter= Username
    3.Parameter= +;-;0 (-=Rechte verbieten, +=Rechte erlauben, 0=alles vorhandene löschen)
    4.Parameter= Flags als String
    Mögliche Flags
    PROCESS_TERMINATE (Erlaubt Process zu beenden $1)
    PROCESS_CREATE_THREAD (Erlaubt einen Remote-Thread durch einen anderen Prozess zu erzeugen $2)
    PROCESS_SET_SESSIONID ($4)
    PROCESS_VM_OPERATION	 (Erlaubt fremdem Prozess Zugriff auf Prozessspeicher zu verändern $8)
    PROCESS_VM_READ (Erlaubt anderem Prozess Prozessspeicher zu lesen $10)
    PROCESS_VM_WRITE (Erlaubt anderem Prozess Prozessspeicher zu schreiben $20)
    PROCESS_DUP_HANDLE (Erlaubt Prozess-Handle zu kopieren $40)
    PROCESS_CREATE_PROCESS (Intern genutzt $80)
    PROCESS_SET_QUOTA ($100)
    PROCESS_SET_INFORMATION (Erlaubt Priorität zu ändern $200)
    PROCESS_QUERY_INFORMATION (Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen $400)
    PROCESS_SUSPEND_RESUME ($800)
    SYNCHRONIZE (Erlaubt einem Handle auf ein Complitition I/O zu warten)
    WRITE_DAC (Ändern der DACL Einträge)
    READ_CONTROL (Lesen der DACL Einträge und Besitzer)
    WRITE_OWNER (Eigentümer ändern)
    _DELETE (löschen)
    GENERIC_READ (Leserecht)
    GENERIC_WRITE (Schreibrecht)
    GENERIC_EXECUTE (Recht zum Ausführen und Durchsuchen).
    GENERIC_ALL (Alle Rechte)
    CLEAR AHRechte$[]
    LET AHRechte$[1,2]=$1
    LET AHRechte$[2,2]=$2
    LET AHRechte$[3,2]=$4
    LET AHRechte$[4,2]=$8
    LET AHRechte$[5,2]=$10
    LET AHRechte$[6,2]=$20
    LET AHRechte$[7,2]=$40
    LET AHRechte$[8,2]=$80
    LET AHRechte$[9,2]=$100
    LET AHRechte$[10,2]=$200
    LET AHRechte$[11,2]=$400
    LET AHRechte$[12,2]=$800
    LET AHRechte$[13,2]=$1000
    LET AHRechte$[14,2]=$2000
    LET AHRechte$[15,2]=$4000
    LET AHRechte$[16,2]=$8000
    LET AHRechte$[17,0]=_DELETE
    LET AHRechte$[17,1]=löschen
    LET AHRechte$[17,2]=$10000
    LET AHRechte$[18,0]=READ_CONTROL
    LET AHRechte$[18,1]=(Lesen der DACL Einträge und Besitzer)
    LET AHRechte$[18,2]=$20000
    LET AHRechte$[19,0]=WRITE_DAC
    LET AHRechte$[19,1]=(Ändern der DACL Einträge)
    LET AHRechte$[19,2]=$40000
    LET AHRechte$[20,0]=WRITE_OWNER
    LET AHRechte$[20,1]=(Eigentümer ändern)
    LET AHRechte$[20,2]=$80000
    LET AHRechte$[21,0]=SYNCHRONIZE
    LET AHRechte$[21,1]=(Erlaubt einem Handle auf ein Complitition I/O zu warten)
    LET AHRechte$[21,2]=$100000
    LET AHRechte$[22,2]=$200000
    LET AHRechte$[23,2]=$400000
    LET AHRechte$[24,2]=$800000
    LET AHRechte$[24,0]=ACCESS_SYSTEM_SECURITY
    LET AHRechte$[24,1]=(Zugriff auf den SACL)
    LET AHRechte$[25,2]=$1000000
    LET AHRechte$[26,2]=$2000000
    LET AHRechte$[27,2]=$4000000
    LET AHRechte$[28,0]=GENERIC_ALL
    LET AHRechte$[28,1]=(Vollzugriff)
    LET AHRechte$[28,2]=$10000000
    LET AHRechte$[29,0]=GENERIC_EXECUTE
    LET AHRechte$[29,1]=(Rechte zum Ausführen und Durchsuchen)
    LET AHRechte$[29,2]=$20000000
    LET AHRechte$[30,0]=GENERIC_WRITE
    LET AHRechte$[30,1]=(Schreibrechte)
    LET AHRechte$[30,2]=$40000000
    LET AHRechte$[31,0]=GENERIC_READ
    LET AHRechte$[31,1]=(Leserechte)
    LET AHRechte$[31,2]=$80000000
    LET AHRechte$[0,0]=PROCESS_ALL_ACCESS
    LET AHRechte$[0,1]=(Vollzugriff)
    LET AHRechte$[0,2]=$1F0FFF
    LET AHRechte$[1,0]=PROCESS_TERMINATE
    LET AHRechte$[1,1]=(Erlaubt Process zu beenden)
    LET AHRechte$[2,0]=PROCESS_CREATE_THREAD
    LET AHRechte$[2,1]=(Erlaubt einen Remote-Thread zu erzeugen)
    LET AHRechte$[3,0]=PROCESS_SET_SESSIONID
    LET AHRechte$[3,1]=($4)
    LET AHRechte$[4,0]=PROCESS_VM_OPERATION
    LET AHRechte$[4,1]=(Erlaubt Zugriff auf Prozessspeicher zu verändern)
    LET AHRechte$[5,0]=PROCESS_VM_READ
    LET AHRechte$[5,1]=(Erlaubt anderem Prozess Prozessspeicher zu lesen)
    LET AHRechte$[6,0]=PROCESS_VM_WRITE
    LET AHRechte$[6,1]=(Erlaubt anderem Prozess Prozessspeicher zu schreiben)
    LET AHRechte$[7,0]=PROCESS_DUP_HANDLE
    LET AHRechte$[7,1]=(Erlaubt Prozess-Handle zu kopieren)
    LET AHRechte$[8,0]=PROCESS_CREATE_PROCESS
    LET AHRechte$[8,1]=($80)
    LET AHRechte$[9,0]=PROCESS_SET_QUOTA
    LET AHRechte$[9,1]=($100)
    LET AHRechte$[10,0]=PROCESS_SET_INFORMATION
    LET AHRechte$[10,1]=(Erlaubt u.a. Priorität zu ändern)
    LET AHRechte$[11,0]=PROCESS_QUERY_INFORMATION
    LET AHRechte$[11,1]=(Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen
    LET AHRechte$[12,0]=PROCESS_SUSPEND_RESUME
    LET AHRechte$[12,1]=($800)
    LET AHRechte$[13,0]=
    LET AHRechte$[13,1]=
    LET AHRechte$[14,0]=
    LET AHRechte$[14,1]=
    LET AHRechte$[15,0]=
    LET AHRechte$[15,1]=
    LET AHRechte$[16,0]=
    LET AHRechte$[16,1]=
    LET AHRechte$[23,0]=
    LET AHRechte$[23,1]=
    LET AHRechte$[24,0]=
    LET AHRechte$[24,1]=
    LET AHRechte$[25,0]=
    LET AHRechte$[25,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[32,0]=PROCESS_READ
    LET AHRechte$[32,1]=(Leserecht)
    LET AHRechte$[32,2]=$20410
    LET AHRechte$[33,0]=PROCESS_EXECUTE
    LET AHRechte$[33,1]=(Recht zum Ausführen und Durchsuchen)
    LET AHRechte$[33,2]=$120000
    LET AHRechte$[34,0]=PROCESS_WRITE
    LET AHRechte$[34,1]=(Schreibrecht)
    LET AHRechte$[34,2]=$020BEB

    IF @AND(F_PROC_USER$<>,@OR(@INSTR(+,Hinzu_entfernen$)>0,@INSTR(-,Hinzu_entfernen$)>0))

        Clear Needed&
        Clear F_SYS$,FSFlags&
        Clear ANZAHL_BYTES&
        Clear F_PROC_Zähler&,ACE_SIZE&
        Clear SecFlag&,ACCESS_MASK&
        Clear Vorhanden&,SecFlag&,NEEDED&
        Clear ACE_ZÄHLER&,SIZE_ACCOUNT&
        LET FSFlags&=0
        DIM STRSID#,256
        DIM P_STRSID#,4
        DIM Needed#,4
        LET FSFLAGS$= +@UPPER$(FSFLAGS$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_ALL,PROCESS_ALL_ACCESS)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_READ,PROCESS_READ)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_WRITE,PROCESS_WRITE)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_EXECUTE,PROCESS_EXECUTE)
        LET Ersatz$=PROCESS_SET_SESSIONID PROCESS_VM_OPERATION PROCESS_CREATE_THREAD PROCESS_VM_WRITE PROCESS_VM_READ PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_SET_QUOTA PROCESS_SET_INFORMATION  PROCESS_QUERY_INFORMATION PROCESS_SUSPEND_RESUME WRITE_DAC
        LET ERSATZ$=ERSATZ$+PROCESS_CREATE_PROCESS READ_CONTROL WRITE_OWNER SYNCHRONIZE READ_CONTROL PROCESS_TERMINATE
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_ALL_ACCESS,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_EXECUTE,SYNCHRONIZE READ_CONTROL)
        LET Ersatz$=PROCESS_SET_INFORMATION PROCESS_SET_QUOTA PROCESS_SUSPEND_RESUME PROCESS_CREATE_PROCESS PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_VM_WRITE PROCESS_VM_OPERATION READ_CONTROL PROCESS_TERMINATE PROCESS_CREATE_THREAD
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_WRITE,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_READ,PROCESS_QUERY_INFORMATION READ_CONTROL PROCESS_TERMINATE )

        IF @UPPER$(F_PROC_Process$)<>

            IF @VAL(F_PROC_Process$)<>0

                LET F_PROC_Process&=@VAL(F_PROC_Process$)

            Else

                THREAD_ID&=@AHGetWindowThreadProcessId(@FINDWINDOW(F_PROC_Process$),@ADDR(PROCESS_ID&))
                LET F_PROC_Process&=@AHOpenProcess($40000 | $20000,0,PROCESS_ID&)

            endif

        else

            LET F_PROC_Process&=@AHGetCurrentProcess()

        endif

        DIM SIDa#,1
        DIM PSECURITY_DESCRIPTOR#,1
        LET SECFLAG&=$1 | $2 | $4
        Long Needed#,0=1
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,1,Needed#)
        LET NEEDED&=@LONG(Needed#,0)
        Dispose PSECURITY_DESCRIPTOR#
        CLEAR NEEDED#
        CASE NEEDED&=0 : LET NEEDED&=1024
        DIM PSECURITY_DESCRIPTOR#,Needed&
        Clear PSECURITY_DESCRIPTOR#
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,Needed&,Needed#)
        DIM ACL_PRESENT#,4
        DIM P_ACL#,4
        DIM ACL_D#,4
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET ANZAHL_BYTES&=8 Für ACL HEADER 8 Bytes veranschlagt

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    Sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2) Die Größen aller ACEs werden addiert.
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    clear SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#

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

                        @AHCopyMemory(STRSID#,@LONG(P_STRSID#,0),256)
                        LET FILE_FEHLER&=@AHLocalFree(@LONG(P_STRSID#,0))

                    endif

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @AND(@BYTE(ACE#,0)=0,@INSTR(+,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                        IF @AND(@BYTE(ACE#,0)=1,@INSTR(-,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                    endif

                    LET ACCESS_MASK&=@LONG(ACE#,4)
                    LET F_PROC_Zähler2&=0

                    While F_PROC_Zähler2&<36

                        sleep 10

                        IF @and(@or(ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2])<>0)

                            LET ACCESS_MASK&=ACCESS_MASK&-@VAl(AHRechte$[F_PROC_Zähler2&,2])

                        endif

                        Let F_PROC_Zähler2&=F_PROC_Zähler2&+1

                    wend

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

                wend

            Endif

            Clear F_PROC_SID_NAME_USE#,F_PROC_ACCOUNT_NAME#,F_PROC_Domain#,SIDa#,F_SYS$
            Long F_PROC_SIZE_ACCOUNT#,0=1
            LONG SIZE_F_PROC_Domain#,0=256
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
            LET SIZE_ACCOUNT&=@LONG(F_PROC_SIZE_ACCOUNT#,0)
            Clear F_PROC_SID_NAME_USE#
            Clear F_PROC_ACCOUNT_NAME#
            Clear F_PROC_Domain#
            Long F_PROC_SIZE_ACCOUNT#,0=SIZE_ACCOUNT&
            LONG SIZE_F_PROC_Domain#,0=256
            Dispose SIDa#
            DIM SIDa#,SIZE_ACCOUNT&
            Clear SIDa#
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)

            IF VORHANDEN&=0

                LET Anzahl_Bytes&=Anzahl_Bytes&+@LONG(F_PROC_SIZE_ACCOUNT#,0)+8 Alle ACEs+SID+ACCESS_MASK+ACE_HEADER

            endif

            IF @INSTR(0,Hinzu_entfernen$)>0

                LET Anzahl_Bytes&=@LONG(F_PROC_SIZE_ACCOUNT#,0)+8+8 SID+ACCESS_MASK+ACE_HEADER+ACL_HEADER

            endif

            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        Endif

        DIM NEW_ACL1#,Anzahl_Bytes&
        LET FILE_FEHLER&=@AHInitializeAcl(NEW_ACL1#,Anzahl_Bytes&,$2)
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET FILE_FEHLER&=@AHIsValidAcl(@long(P_ACL#,0))

        IF @INSTR(-,Hinzu_entfernen$)>0

            LET ACE_ZÄHLER&=1

        else

            LET ACE_ZÄHLER&=0

        endif

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    sleep 10
                    sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    REM
                    DIM SID2#,ACE_SIZE&
                    CLEAR SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#
                    LET ACCESS_MASK&=@LONG(ACE#,4)

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @BYTE(ACE#,0)=0

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                CASE @INSTR(0,Hinzu_entfernen$)=0 : LET FSFlags&=ACCESS_MASK&

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                if @INSTR(0,Hinzu_entfernen$)=0

                                    LET F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                ENDIF

                            endif

                        Elseif @BYTE(ACE#,0)=1

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0

                                                LET ACCESS_MASK&=ACCESS_MASK& | @val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            endif

                        endif

                    else

                        IF @INSTR(0,Hinzu_entfernen$)=0

                            IF ACCESS_MASK&<>0

                                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                            endif

                        endif

                    endif

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

                wend

            Endif

            DIM ACE#,SIZE_ACCOUNT&+8

            IF @INSTR(+,Hinzu_entfernen$)>0

                Byte ACE#,0=0
                LET CFS$=Bei ALLOWED_ACE...

            ELSEIF @INSTR(-,Hinzu_entfernen$)>0

                Byte ACE#,0=1
                LET CFS$=Bei DENIED_ACE...

            endif

            LEt F_PROC_Zähler2&=0

            While F_PROC_Zähler2&<36

                sleep 10

                IF AHRechte$[F_PROC_Zähler2&,0]<>

                    IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFlags$))>0

                        LET FSFlags&=@OR(FSFLAGS&,@val(AHRechte$[F_PROC_Zähler2&,2]))

                    endif

                endif

                LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

            wend

            Byte ACE#,1=0
            WORD ACE#,2=SIZE_ACCOUNT&+8
            LONG ACE#,4=FSFlags&
            LET F_PROC_Zähler&=0

            WHILE F_PROC_Zähler&<>SIZE_ACCOUNT&

                sleep 10
                BYTE ACE#,8+F_PROC_Zähler&=@BYTE(SIDa#,F_PROC_Zähler&)
                LET F_PROC_Zähler&=F_PROC_Zähler&+1

            WEND

            IF @INSTR(-,Hinzu_entfernen$)>0

                LET ACE_ZÄHLER&=0

            endif

            IF FSFlags&<>0

                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,SIZE_ACCOUNT&+8)

            Endif

            LET FILE_FEHLER&=@AHInitializeSecurityDescriptor(PSECURITY_DESCRIPTOR#,$1)
            LET FILE_FEHLER&=@AHSetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,1,NEW_ACL1#,0)
            LET FILE_FEHLER&=@AHSetKernelObjectSecurity(F_PROC_Process&,$4,PSECURITY_DESCRIPTOR#)
            @AHCloseHandle(F_PROC_Process&)
            DISPOSE ACE#
            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        endif

        Dispose PSECURITY_DESCRIPTOR#
        Dispose Needed#
        Dispose NEW_ACL1#
        Dispose ACL_PRESENT#
        Dispose P_ACL#
        Dispose ACL_D#
        Dispose SIDa#
        Dispose STRSID#
        Dispose P_STRSID#

    endif

ENDPROC


Viel Amusement avec cela...

Salut

Andreas
 
15.12.2005  
 




Jac
de
Lad
on muss déjà entier joli fou son, um so quelque chose trop écrivons. et très viel Zeit avons.

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
15.12.2005  
 




Michael
Wodrich
et cela Ganze ensuite aussi encore dans v7.5

la fois voyons, si je là montée.
AH ist oui derzeit wirklich qui einzige, qui so tief dans den Eingeweiden des Systems zugange ist...

belle Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
15.12.2005  
 



il faut pas fou son, il faut seulement intérêt à neuen Opportunités avons. sous XP/2000/NT basé alles sur solchen Geschichten, et si on là quelque chose pas kennt, pas sais ou bien beachtet, peux es sous Umständen possible son, qui sur einem eingeschränkten System (Firmen-PC) rien plus funktioniert.
cela est im Klartext: sans savons sur cela Sycherheitssystem de NT peux on meiner attitude pour eigentlich aucun vernünftigen Anwendungen écrivons - z.B. comme Admin encore pas einmal sa montre pour qui Zeit aus dem Internet se mettre .
cet INC ist seulement un kleiner Ausschnitt qui andern INC (DACL_SET.INC), qui encore wesentlich plus peux. Hauptanteil qui INC ist cela Erstellen einer LOG-Dossier zum Erkennen et Beheben de Fehlern (suis, glaube je, einer qui ersten dans l'allemagne, qui quelque chose comme gebaut hat - voilà cela plus que nötig).

Manko zur Zeit: Es wird aucun hérédité et es volonté seulement Standard ACEs soutenu. dans qui règle reicht cela mais aus.

quoi peux on avec cela Anfangen: z.B. Prozesse dans einem eigenen Taskmanager finissons, qui sich avec normalen mitteln sous Windows2000 pas killen laisser (Viren peut-être.). sans cet INC peux qui Taskmanager de XP wesentlich plus que chacun selbstgeschriebene, car il peut solche Prozesse par changement qui Zugriffsrechte, comme aussi cet INC tut, finissons.
alors: Kleines Geschenk u.a. pour Melanie pour den Bau ihres Taskmanagers...

Microsoft scheint im Augenblick et avec ca Probleme avec Timingangelegenheiten beim mettons de ACEs trop avons, on sollte sich c'est pourquoi oui c'est ca überlegen, wohin et quand on cela einsetzt et fertige Programme aussi possible sur vielen unterschiedlichen Rechnern testen...
 
15.12.2005  
 



@AH: Aus diesem Grund nimmt on wohl besser un tolles Linux. Windows ist zwar sicherlich gesammtheitlich fähiger - mais si Zeit argent kostet malheureusement aussi unwirtschaftlicher.

Sinn meiner discours: ((Windows+Sicherheit)/Aufwand<1)
 
15.12.2005  
 



Hab de Linux malheureusement pas qui leiseste Ahnung. Aussi fonctionne sur den meisten Rechnern (Firmenrechner eingeschlossen) un Windowssystem. seulement weil es aufwendig aussieht (liegt peut-être seulement à mir) et compliqué wirkt (ist es mais pas, liegt à Microsofts Erklärungen => cela quoi je verstanden habe et anwende, pourrait je besser expliquer ), sollte on sich en pas rebuter laisser. qui Opportunités pour qui Zukunft sommes là riesengroß et >>>1- pourquoi toujours seulement solche Sachen écrivons, qui chacun peux et chacun écrit?

entier entier kleiner Auszug aus den Opportunités:
- Taskmanager écrivons, qui geschützte Prozesse débrancher peut
- Taskmanager écrivons, qui den User eines Prozesses auslesen peut
- Virenschutz écrivons
- Virenscanner écrivons, qui sämmtliche Profile aller User de einem einzigen Profil aus untersuchen et bereinigen peut
- Kindersicherung écrivons, qui quoique vous dans einem Adminprofile läuftz, Einschränkungen et gleichzeitig cela Spielen permet
- calculateur pour Internetzeit se mettre
- calculateur par API pour Zeitintervall herunterfahren ou bien neustarten
- Setupprogramme écrivons, qui es ermöglichen eigene Jeux et Anwendungen aussi dans einem Userprofile avec eingeschränkten Rechten trop starten
- Zeitkontrollprogramme écrivons, qui sich vom User pas débrancher laisser
- .......................................

qui rien nouveau utilise ou bien wem qui Aufwand trop grand ist, qui peux aussi sur et pour Windows98 Systeme écrivons (là fonctionne, aufgrund qui fehlenden Security, sowieso alles wesentlich plus rapide). égal quoi il peut, quelque chose wirklich nouveau ou bien besonderes wird il mais nie trop stande bekommen.
quoi utilise es mir, une Zeitplaner ou bien Taskmanager trop écrivons, qui dans cette Art 1000 la fois im Internet downloadbar ist? Sollte on là pas lieber sa Zeit avec cela verschwenden Sachen trop entwickeln, qui es weltweit seulement 1-2x ou bien so encore gar pas gibt???

Comme je le disais - sous neuen Windows Systemen richtet sich eigentlich presque alles pour qui Security (et alles pour dem selben Muster). Selbst comme Admin ist on eingeschränkt et peux quelques wichtige APIs (un Beispiel = montre se mettre ) pas sans weiteres nutzen. pas einmal cela Dateisystem ist voll et entier pour Admins zugänglich (avec NTFS).
 
16.12.2005  
 



Kleiner Bugfix:
par une trop grßzügige Kopiererei beim Cordes-SID konnte es peut-être. trop zeitweisen Zugriffsverletzungen venons. faute wurde beseitigt:
KompilierenMarqueSéparation
DEF @AHGetWindowThreadProcessId(2) !USER32,GetWindowThreadProcessId
DEF @AHGetCurrentProcess(0) !KERNEL32,GetCurrentProcess
DEF @AHOpenProcess(3) !KERNEL32,OpenProcess
DEF @AHCloseHandle(1) !KERNEL32,CloseHandle
DEF @AHGetKernelObjectSecurity(5) !ADVAPI32,GetKernelObjectSecurity
DEF @AHSetKernelObjectSecurity(3) !ADVAPI32,SetKernelObjectSecurity
DEF @AHLookupAccountName(7) !advapi32,LookupAccountNameA
DEF @AHCopyMemory(3) !kernel32,RtlMoveMemory
DEF @AHInitializeSecurityDescriptor(2) !ADVAPI32,InitializeSecurityDescriptor
DEF @AHSetSecurityDescriptorDacl(4) !ADVAPI32,SetSecurityDescriptorDacl
DEF @AHAddAce(5) !ADVAPI32,AddAce
DEF @AHGetSecurityDescriptorOwner(3) !ADVAPI32,GetSecurityDescriptorOwner
DEF @AHGetSecurityDescriptorGroup(3) !ADVAPI32,GetSecurityDescriptorGroup
DEF @AHGetSecurityDescriptorDACL(4) !ADVAPI32,GetSecurityDescriptorDacl
DEF @AHLookupAccountSid(7) !ADVAPI32,LookupAccountSidA
DEF @AHIsValidAcl(1) !ADVAPI32,IsValidAcl
DEF @AHGetAclInformation(4) !ADVAPI32,GetAclInformation
DEF @AHGetAce(3) !ADVAPI32,GetAce
DEF @AHLocalFree(1) !KERNEL32,LocalFree
DEF @AHInitializeAcl(3) !ADVAPI32,InitializeAcl
DEF @AHLocalSize(1) !KERNEL32,LocalSize
Declare FILE_FEHLER&,CBNAME$
Declare SEC_ID#,CBNAME_SIZE#,CBNAME#
Declare SID#,F_PROC_SID_NAME_USE#
Declare Needed#,NEW_ACL1#,SIDA#
Declare STRSID#,ACL_INFO#,ACE#,P_ACE#,P_STRSID#
Declare SID2#,P_ACL#,ACL_D#
Declare PSECURITY_DESCRIPTOR#,ACL_PRESENT#
Declare F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#
Declare AHRechte$[36,2],F_PROC_Zähler2&

Proc Set_Process_ACE_IN_DACL

    Parameters F_PROC_Process$,F_PROC_USER$,Hinzu_entfernen$,FSFLAGS$
    Declare F_SYS$,Needed&
    Declare F_LAUFWERK$
    Declare FSFlags&
    Declare ANZAHL_BYTES&
    Declare F_PROC_Zähler&,ACE_SIZE&
    Declare IO%,SecFlag&,ACCESS_MASK&
    Declare Vorhanden&,SecFlag&,NEEDED&
    Declare ACE_ZÄHLER&,SIZE_ACCOUNT&
    Declare CFS$,PROCESS_ID&,THREAD_ID&,F_PROC_Process&,Ersatz$
    1.Parameter=
    Das Handle eines Prozesses als String,
    der Titel eines Fensters
    oder ein Leerstring für den aktuellen Prozess
    2.Parameter= Username
    3.Parameter= +;-;0 (-=Rechte verbieten, +=Rechte erlauben, 0=alles vorhandene löschen)
    4.Parameter= Flags als String
    Mögliche Flags
    PROCESS_TERMINATE (Erlaubt Process zu beenden $1)
    PROCESS_CREATE_THREAD (Erlaubt einen Remote-Thread durch einen anderen Prozess zu erzeugen $2)
    PROCESS_SET_SESSIONID ($4)
    PROCESS_VM_OPERATION	 (Erlaubt fremdem Prozess Zugriff auf Prozessspeicher zu verändern $8)
    PROCESS_VM_READ (Erlaubt anderem Prozess Prozessspeicher zu lesen $10)
    PROCESS_VM_WRITE (Erlaubt anderem Prozess Prozessspeicher zu schreiben $20)
    PROCESS_DUP_HANDLE (Erlaubt Prozess-Handle zu kopieren $40)
    PROCESS_CREATE_PROCESS (Intern genutzt $80)
    PROCESS_SET_QUOTA ($100)
    PROCESS_SET_INFORMATION (Erlaubt Priorität zu ändern $200)
    PROCESS_QUERY_INFORMATION (Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen $400)
    PROCESS_SUSPEND_RESUME ($800)
    SYNCHRONIZE (Erlaubt einem Handle auf ein Complitition I/O zu warten)
    WRITE_DAC (Ändern der DACL Einträge)
    READ_CONTROL (Lesen der DACL Einträge und Besitzer)
    WRITE_OWNER (Eigentümer ändern)
    _DELETE (löschen)
    GENERIC_READ (Leserecht)
    GENERIC_WRITE (Schreibrecht)
    GENERIC_EXECUTE (Recht zum Ausführen und Durchsuchen).
    GENERIC_ALL (Alle Rechte)
    CLEAR AHRechte$[]
    LET AHRechte$[1,2]=$1
    LET AHRechte$[2,2]=$2
    LET AHRechte$[3,2]=$4
    LET AHRechte$[4,2]=$8
    LET AHRechte$[5,2]=$10
    LET AHRechte$[6,2]=$20
    LET AHRechte$[7,2]=$40
    LET AHRechte$[8,2]=$80
    LET AHRechte$[9,2]=$100
    LET AHRechte$[10,2]=$200
    LET AHRechte$[11,2]=$400
    LET AHRechte$[12,2]=$800
    LET AHRechte$[13,2]=$1000
    LET AHRechte$[14,2]=$2000
    LET AHRechte$[15,2]=$4000
    LET AHRechte$[16,2]=$8000
    LET AHRechte$[17,0]=_DELETE
    LET AHRechte$[17,1]=löschen
    LET AHRechte$[17,2]=$10000
    LET AHRechte$[18,0]=READ_CONTROL
    LET AHRechte$[18,1]=(Lesen der DACL Einträge und Besitzer)
    LET AHRechte$[18,2]=$20000
    LET AHRechte$[19,0]=WRITE_DAC
    LET AHRechte$[19,1]=(Ändern der DACL Einträge)
    LET AHRechte$[19,2]=$40000
    LET AHRechte$[20,0]=WRITE_OWNER
    LET AHRechte$[20,1]=(Eigentümer ändern)
    LET AHRechte$[20,2]=$80000
    LET AHRechte$[21,0]=SYNCHRONIZE
    LET AHRechte$[21,1]=(Erlaubt einem Handle auf ein Complitition I/O zu warten)
    LET AHRechte$[21,2]=$100000
    LET AHRechte$[22,2]=$200000
    LET AHRechte$[23,2]=$400000
    LET AHRechte$[24,2]=$800000
    LET AHRechte$[24,0]=ACCESS_SYSTEM_SECURITY
    LET AHRechte$[24,1]=(Zugriff auf den SACL)
    LET AHRechte$[25,2]=$1000000
    LET AHRechte$[26,2]=$2000000
    LET AHRechte$[27,2]=$4000000
    LET AHRechte$[28,0]=GENERIC_ALL
    LET AHRechte$[28,1]=(Vollzugriff)
    LET AHRechte$[28,2]=$10000000
    LET AHRechte$[29,0]=GENERIC_EXECUTE
    LET AHRechte$[29,1]=(Rechte zum Ausführen und Durchsuchen)
    LET AHRechte$[29,2]=$20000000
    LET AHRechte$[30,0]=GENERIC_WRITE
    LET AHRechte$[30,1]=(Schreibrechte)
    LET AHRechte$[30,2]=$40000000
    LET AHRechte$[31,0]=GENERIC_READ
    LET AHRechte$[31,1]=(Leserechte)
    LET AHRechte$[31,2]=$80000000
    LET AHRechte$[0,0]=PROCESS_ALL_ACCESS
    LET AHRechte$[0,1]=(Vollzugriff)
    LET AHRechte$[0,2]=$1F0FFF
    LET AHRechte$[1,0]=PROCESS_TERMINATE
    LET AHRechte$[1,1]=(Erlaubt Process zu beenden)
    LET AHRechte$[2,0]=PROCESS_CREATE_THREAD
    LET AHRechte$[2,1]=(Erlaubt einen Remote-Thread zu erzeugen)
    LET AHRechte$[3,0]=PROCESS_SET_SESSIONID
    LET AHRechte$[3,1]=($4)
    LET AHRechte$[4,0]=PROCESS_VM_OPERATION
    LET AHRechte$[4,1]=(Erlaubt Zugriff auf Prozessspeicher zu verändern)
    LET AHRechte$[5,0]=PROCESS_VM_READ
    LET AHRechte$[5,1]=(Erlaubt anderem Prozess Prozessspeicher zu lesen)
    LET AHRechte$[6,0]=PROCESS_VM_WRITE
    LET AHRechte$[6,1]=(Erlaubt anderem Prozess Prozessspeicher zu schreiben)
    LET AHRechte$[7,0]=PROCESS_DUP_HANDLE
    LET AHRechte$[7,1]=(Erlaubt Prozess-Handle zu kopieren)
    LET AHRechte$[8,0]=PROCESS_CREATE_PROCESS
    LET AHRechte$[8,1]=($80)
    LET AHRechte$[9,0]=PROCESS_SET_QUOTA
    LET AHRechte$[9,1]=($100)
    LET AHRechte$[10,0]=PROCESS_SET_INFORMATION
    LET AHRechte$[10,1]=(Erlaubt u.a. Priorität zu ändern)
    LET AHRechte$[11,0]=PROCESS_QUERY_INFORMATION
    LET AHRechte$[11,1]=(Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen
    LET AHRechte$[12,0]=PROCESS_SUSPEND_RESUME
    LET AHRechte$[12,1]=($800)
    LET AHRechte$[13,0]=
    LET AHRechte$[13,1]=
    LET AHRechte$[14,0]=
    LET AHRechte$[14,1]=
    LET AHRechte$[15,0]=
    LET AHRechte$[15,1]=
    LET AHRechte$[16,0]=
    LET AHRechte$[16,1]=
    LET AHRechte$[23,0]=
    LET AHRechte$[23,1]=
    LET AHRechte$[24,0]=
    LET AHRechte$[24,1]=
    LET AHRechte$[25,0]=
    LET AHRechte$[25,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[32,0]=PROCESS_READ
    LET AHRechte$[32,1]=(Leserecht)
    LET AHRechte$[32,2]=$20410
    LET AHRechte$[33,0]=PROCESS_EXECUTE
    LET AHRechte$[33,1]=(Recht zum Ausführen und Durchsuchen)
    LET AHRechte$[33,2]=$120000
    LET AHRechte$[34,0]=PROCESS_WRITE
    LET AHRechte$[34,1]=(Schreibrecht)
    LET AHRechte$[34,2]=$020BEB

    IF @AND(F_PROC_USER$<>,@OR(@INSTR(+,Hinzu_entfernen$)>0,@INSTR(-,Hinzu_entfernen$)>0))

        Clear Needed&
        Clear F_SYS$,FSFlags&
        Clear ANZAHL_BYTES&
        Clear F_PROC_Zähler&,ACE_SIZE&
        Clear SecFlag&,ACCESS_MASK&
        Clear Vorhanden&,SecFlag&,NEEDED&
        Clear ACE_ZÄHLER&,SIZE_ACCOUNT&
        LET FSFlags&=0
        DIM STRSID#,500
        DIM P_STRSID#,4
        DIM Needed#,4
        LET FSFLAGS$= +@UPPER$(FSFLAGS$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_ALL,PROCESS_ALL_ACCESS)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_READ,PROCESS_READ)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_WRITE,PROCESS_WRITE)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_EXECUTE,PROCESS_EXECUTE)
        LET Ersatz$=PROCESS_SET_SESSIONID PROCESS_VM_OPERATION PROCESS_CREATE_THREAD PROCESS_VM_WRITE PROCESS_VM_READ PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_SET_QUOTA PROCESS_SET_INFORMATION  PROCESS_QUERY_INFORMATION PROCESS_SUSPEND_RESUME WRITE_DAC
        LET ERSATZ$=ERSATZ$+PROCESS_CREATE_PROCESS READ_CONTROL WRITE_OWNER SYNCHRONIZE READ_CONTROL PROCESS_TERMINATE
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_ALL_ACCESS,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_EXECUTE,SYNCHRONIZE READ_CONTROL)
        LET Ersatz$=PROCESS_SET_INFORMATION PROCESS_SET_QUOTA PROCESS_SUSPEND_RESUME PROCESS_CREATE_PROCESS PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_VM_WRITE PROCESS_VM_OPERATION READ_CONTROL PROCESS_TERMINATE PROCESS_CREATE_THREAD
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_WRITE,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_READ,PROCESS_QUERY_INFORMATION READ_CONTROL PROCESS_TERMINATE )

        IF @UPPER$(F_PROC_Process$)<>

            IF @VAL(F_PROC_Process$)<>0

                LET F_PROC_Process&=@VAL(F_PROC_Process$)

            Else

                THREAD_ID&=@AHGetWindowThreadProcessId(@FINDWINDOW(F_PROC_Process$),@ADDR(PROCESS_ID&))
                LET F_PROC_Process&=@AHOpenProcess($40000 | $20000,0,PROCESS_ID&)

            endif

        else

            LET F_PROC_Process&=@AHGetCurrentProcess()

        endif

        DIM SIDa#,1
        DIM PSECURITY_DESCRIPTOR#,1
        LET SECFLAG&=$1 | $2 | $4
        Long Needed#,0=1
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,1,Needed#)
        LET NEEDED&=@LONG(Needed#,0)
        Dispose PSECURITY_DESCRIPTOR#
        CLEAR NEEDED#
        CASE NEEDED&=0 : LET NEEDED&=1024
        DIM PSECURITY_DESCRIPTOR#,Needed&
        Clear PSECURITY_DESCRIPTOR#
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,Needed&,Needed#)
        DIM ACL_PRESENT#,4
        DIM P_ACL#,4
        DIM ACL_D#,4
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET ANZAHL_BYTES&=8 Für ACL HEADER 8 Bytes veranschlagt

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    Sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2) Die Größen aller ACEs werden addiert.
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    clear SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#

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

                        @AHCopyMemory(STRSID#,@LONG(P_STRSID#,0),@AHLocalSize(@LONG(P_STRSID#,0)))
                        LET FILE_FEHLER&=@AHLocalFree(@LONG(P_STRSID#,0))

                    endif

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @AND(@BYTE(ACE#,0)=0,@INSTR(+,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                        IF @AND(@BYTE(ACE#,0)=1,@INSTR(-,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                    endif

                    LET ACCESS_MASK&=@LONG(ACE#,4)
                    LET F_PROC_Zähler2&=0

                    While F_PROC_Zähler2&<36

                        sleep 10

                        IF @and(@or(ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2])<>0)

                            LET ACCESS_MASK&=ACCESS_MASK&-@VAl(AHRechte$[F_PROC_Zähler2&,2])

                        endif

                        Let F_PROC_Zähler2&=F_PROC_Zähler2&+1

                    wend

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

                wend

            Endif

            Clear F_PROC_SID_NAME_USE#,F_PROC_ACCOUNT_NAME#,F_PROC_Domain#,SIDa#,F_SYS$
            Long F_PROC_SIZE_ACCOUNT#,0=1
            LONG SIZE_F_PROC_Domain#,0=256
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
            LET SIZE_ACCOUNT&=@LONG(F_PROC_SIZE_ACCOUNT#,0)
            Clear F_PROC_SID_NAME_USE#
            Clear F_PROC_ACCOUNT_NAME#
            Clear F_PROC_Domain#
            Long F_PROC_SIZE_ACCOUNT#,0=SIZE_ACCOUNT&
            LONG SIZE_F_PROC_Domain#,0=256
            Dispose SIDa#
            DIM SIDa#,SIZE_ACCOUNT&
            Clear SIDa#
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)

            IF VORHANDEN&=0

                LET Anzahl_Bytes&=Anzahl_Bytes&+@LONG(F_PROC_SIZE_ACCOUNT#,0)+8 Alle ACEs+SID+ACCESS_MASK+ACE_HEADER

            endif

            IF @INSTR(0,Hinzu_entfernen$)>0

                LET Anzahl_Bytes&=@LONG(F_PROC_SIZE_ACCOUNT#,0)+8+8 SID+ACCESS_MASK+ACE_HEADER+ACL_HEADER

            endif

            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        Endif

        DIM NEW_ACL1#,Anzahl_Bytes&
        LET FILE_FEHLER&=@AHInitializeAcl(NEW_ACL1#,Anzahl_Bytes&,$2)
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET FILE_FEHLER&=@AHIsValidAcl(@long(P_ACL#,0))

        IF @INSTR(-,Hinzu_entfernen$)>0

            LET ACE_ZÄHLER&=1

        else

            LET ACE_ZÄHLER&=0

        endif

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    sleep 10
                    sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    REM
                    DIM SID2#,ACE_SIZE&
                    CLEAR SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#
                    LET ACCESS_MASK&=@LONG(ACE#,4)

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @BYTE(ACE#,0)=0

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                CASE @INSTR(0,Hinzu_entfernen$)=0 : LET FSFlags&=ACCESS_MASK&

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                if @INSTR(0,Hinzu_entfernen$)=0

                                    LET F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                ENDIF

                            endif

                        Elseif @BYTE(ACE#,0)=1

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0

                                                LET ACCESS_MASK&=ACCESS_MASK& | @val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            endif

                        endif

                    else

                        IF @INSTR(0,Hinzu_entfernen$)=0

                            IF ACCESS_MASK&<>0

                                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                            endif

                        endif

                    endif

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

                wend

            Endif

            DIM ACE#,SIZE_ACCOUNT&+8

            IF @INSTR(+,Hinzu_entfernen$)>0

                Byte ACE#,0=0
                LET CFS$=Bei ALLOWED_ACE...

            ELSEIF @INSTR(-,Hinzu_entfernen$)>0

                Byte ACE#,0=1
                LET CFS$=Bei DENIED_ACE...

            endif

            LEt F_PROC_Zähler2&=0

            While F_PROC_Zähler2&<36

                sleep 10

                IF AHRechte$[F_PROC_Zähler2&,0]<>

                    IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFlags$))>0

                        LET FSFlags&=@OR(FSFLAGS&,@val(AHRechte$[F_PROC_Zähler2&,2]))

                    endif

                endif

                LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

            wend

            Byte ACE#,1=0
            WORD ACE#,2=SIZE_ACCOUNT&+8
            LONG ACE#,4=FSFlags&
            LET F_PROC_Zähler&=0

            WHILE F_PROC_Zähler&<>SIZE_ACCOUNT&

                sleep 10
                BYTE ACE#,8+F_PROC_Zähler&=@BYTE(SIDa#,F_PROC_Zähler&)
                LET F_PROC_Zähler&=F_PROC_Zähler&+1

            WEND

            IF @INSTR(-,Hinzu_entfernen$)>0

                LET ACE_ZÄHLER&=0

            endif

            IF FSFlags&<>0

                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,SIZE_ACCOUNT&+8)

            Endif

            LET FILE_FEHLER&=@AHInitializeSecurityDescriptor(PSECURITY_DESCRIPTOR#,$1)
            LET FILE_FEHLER&=@AHSetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,1,NEW_ACL1#,0)
            LET FILE_FEHLER&=@AHSetKernelObjectSecurity(F_PROC_Process&,$4,PSECURITY_DESCRIPTOR#)
            @AHCloseHandle(F_PROC_Process&)
            DISPOSE ACE#
            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        endif

        Dispose PSECURITY_DESCRIPTOR#
        Dispose Needed#
        Dispose NEW_ACL1#
        Dispose ACL_PRESENT#
        Dispose P_ACL#
        Dispose ACL_D#
        Dispose SIDa#
        Dispose STRSID#
        Dispose P_STRSID#

    endif

ENDPROC

 
31.12.2005  
 



Kleines mais wichtiges update:
KompilierenMarqueSéparation
DEF @AHGetWindowThreadProcessId(2) !USER32,GetWindowThreadProcessId
DEF @AHGetCurrentProcess(0) !KERNEL32,GetCurrentProcess
DEF @AHOpenProcess(3) !KERNEL32,OpenProcess
DEF @AHCloseHandle(1) !KERNEL32,CloseHandle
DEF @AHGetKernelObjectSecurity(5) !ADVAPI32,GetKernelObjectSecurity
DEF @AHSetKernelObjectSecurity(3) !ADVAPI32,SetKernelObjectSecurity
DEF @AHLookupAccountName(7) !advapi32,LookupAccountNameA
DEF @AHCopyMemory(3) !kernel32,RtlMoveMemory
DEF @AHInitializeSecurityDescriptor(2) !ADVAPI32,InitializeSecurityDescriptor
DEF @AHSetSecurityDescriptorDacl(4) !ADVAPI32,SetSecurityDescriptorDacl
DEF @AHAddAce(5) !ADVAPI32,AddAce
DEF @AHGetSecurityDescriptorOwner(3) !ADVAPI32,GetSecurityDescriptorOwner
DEF @AHGetSecurityDescriptorGroup(3) !ADVAPI32,GetSecurityDescriptorGroup
DEF @AHGetSecurityDescriptorDACL(4) !ADVAPI32,GetSecurityDescriptorDacl
DEF @AHLookupAccountSid(7) !ADVAPI32,LookupAccountSidA
DEF @AHIsValidAcl(1) !ADVAPI32,IsValidAcl
DEF @AHGetAclInformation(4) !ADVAPI32,GetAclInformation
DEF @AHGetAce(3) !ADVAPI32,GetAce
DEF @AHLocalFree(1) !KERNEL32,LocalFree
DEF @AHInitializeAcl(3) !ADVAPI32,InitializeAcl
DEF @AHLocalSize(1) !KERNEL32,LocalSize
Def @AHMakeAbsoluteSD(11) !ADVAPI32,MakeAbsoluteSD
Def @AHMakeSelfRelativeSD(3) !ADVAPI32,MakeSelfRelativeSD
Declare FILE_FEHLER&,CBNAME$
Declare SEC_ID#,CBNAME_SIZE#,CBNAME#
Declare SID#,F_PROC_SID_NAME_USE#
Declare Needed#,NEW_ACL1#,SIDA#
Declare STRSID#,ACL_INFO#,ACE#,P_ACE#,P_STRSID#
Declare SID2#,P_ACL#,ACL_D#
Declare PSECURITY_DESCRIPTOR#,ACL_PRESENT#
Declare F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#
Declare AHRechte$[36,2],F_PROC_Zähler2&,F_Ab_SD#,F_Ab_Size&
Declare F_Ab_DACL#,F_Ab_DACLSize&,F_Ab_SACL#,F_Ab_SACLSize&
Declare F_Ab_Owner#,F_Ab_OwnerSize&,F_Ab_PG#,F_Ab_PGSize&,SR_SIZE&,F_SELF#

Proc Set_Process_ACE_IN_DACL

    Parameters F_PROC_Process$,F_PROC_USER$,Hinzu_entfernen$,FSFLAGS$
    Declare F_SYS$,Needed&
    Declare F_LAUFWERK$
    Declare FSFlags&
    Declare ANZAHL_BYTES&
    Declare F_PROC_Zähler&,ACE_SIZE&
    Declare IO%,SecFlag&,ACCESS_MASK&
    Declare Vorhanden&,SecFlag&,NEEDED&
    Declare ACE_ZÄHLER&,SIZE_ACCOUNT&
    Declare CFS$,PROCESS_ID&,THREAD_ID&,F_PROC_Process&,Ersatz$
    1.Parameter=
    Das Handle eines Prozesses als String,
    der Titel eines Fensters
    oder ein Leerstring für den aktuellen Prozess
    2.Parameter= Username
    3.Parameter= +;-;0 (-=Rechte verbieten, +=Rechte erlauben, 0=alles vorhandene löschen)
    4.Parameter= Flags als String
    Mögliche Flags
    PROCESS_TERMINATE (Erlaubt Process zu beenden $1)
    PROCESS_CREATE_THREAD (Erlaubt einen Remote-Thread durch einen anderen Prozess zu erzeugen $2)
    PROCESS_SET_SESSIONID ($4)
    PROCESS_VM_OPERATION	 (Erlaubt fremdem Prozess Zugriff auf Prozessspeicher zu verändern $8)
    PROCESS_VM_READ (Erlaubt anderem Prozess Prozessspeicher zu lesen $10)
    PROCESS_VM_WRITE (Erlaubt anderem Prozess Prozessspeicher zu schreiben $20)
    PROCESS_DUP_HANDLE (Erlaubt Prozess-Handle zu kopieren $40)
    PROCESS_CREATE_PROCESS (Intern genutzt $80)
    PROCESS_SET_QUOTA ($100)
    PROCESS_SET_INFORMATION (Erlaubt Priorität zu ändern $200)
    PROCESS_QUERY_INFORMATION (Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen $400)
    PROCESS_SUSPEND_RESUME ($800)
    SYNCHRONIZE (Erlaubt einem Handle auf ein Complitition I/O zu warten)
    WRITE_DAC (Ändern der DACL Einträge)
    READ_CONTROL (Lesen der DACL Einträge und Besitzer)
    WRITE_OWNER (Eigentümer ändern)
    _DELETE (löschen)
    GENERIC_READ (Leserecht)
    GENERIC_WRITE (Schreibrecht)
    GENERIC_EXECUTE (Recht zum Ausführen und Durchsuchen).
    GENERIC_ALL (Alle Rechte)
    CLEAR AHRechte$[]
    LET AHRechte$[1,2]=$1
    LET AHRechte$[2,2]=$2
    LET AHRechte$[3,2]=$4
    LET AHRechte$[4,2]=$8
    LET AHRechte$[5,2]=$10
    LET AHRechte$[6,2]=$20
    LET AHRechte$[7,2]=$40
    LET AHRechte$[8,2]=$80
    LET AHRechte$[9,2]=$100
    LET AHRechte$[10,2]=$200
    LET AHRechte$[11,2]=$400
    LET AHRechte$[12,2]=$800
    LET AHRechte$[13,2]=$1000
    LET AHRechte$[14,2]=$2000
    LET AHRechte$[15,2]=$4000
    LET AHRechte$[16,2]=$8000
    LET AHRechte$[17,0]=_DELETE
    LET AHRechte$[17,1]=löschen
    LET AHRechte$[17,2]=$10000
    LET AHRechte$[18,0]=READ_CONTROL
    LET AHRechte$[18,1]=(Lesen der DACL Einträge und Besitzer)
    LET AHRechte$[18,2]=$20000
    LET AHRechte$[19,0]=WRITE_DAC
    LET AHRechte$[19,1]=(Ändern der DACL Einträge)
    LET AHRechte$[19,2]=$40000
    LET AHRechte$[20,0]=WRITE_OWNER
    LET AHRechte$[20,1]=(Eigentümer ändern)
    LET AHRechte$[20,2]=$80000
    LET AHRechte$[21,0]=SYNCHRONIZE
    LET AHRechte$[21,1]=(Erlaubt einem Handle auf ein Complitition I/O zu warten)
    LET AHRechte$[21,2]=$100000
    LET AHRechte$[22,2]=$200000
    LET AHRechte$[23,2]=$400000
    LET AHRechte$[24,2]=$800000
    LET AHRechte$[24,0]=ACCESS_SYSTEM_SECURITY
    LET AHRechte$[24,1]=(Zugriff auf den SACL)
    LET AHRechte$[25,2]=$1000000
    LET AHRechte$[26,2]=$2000000
    LET AHRechte$[27,2]=$4000000
    LET AHRechte$[28,0]=GENERIC_ALL
    LET AHRechte$[28,1]=(Vollzugriff)
    LET AHRechte$[28,2]=$10000000
    LET AHRechte$[29,0]=GENERIC_EXECUTE
    LET AHRechte$[29,1]=(Rechte zum Ausführen und Durchsuchen)
    LET AHRechte$[29,2]=$20000000
    LET AHRechte$[30,0]=GENERIC_WRITE
    LET AHRechte$[30,1]=(Schreibrechte)
    LET AHRechte$[30,2]=$40000000
    LET AHRechte$[31,0]=GENERIC_READ
    LET AHRechte$[31,1]=(Leserechte)
    LET AHRechte$[31,2]=$80000000
    LET AHRechte$[0,0]=PROCESS_ALL_ACCESS
    LET AHRechte$[0,1]=(Vollzugriff)
    LET AHRechte$[0,2]=$1F0FFF
    LET AHRechte$[1,0]=PROCESS_TERMINATE
    LET AHRechte$[1,1]=(Erlaubt Process zu beenden)
    LET AHRechte$[2,0]=PROCESS_CREATE_THREAD
    LET AHRechte$[2,1]=(Erlaubt einen Remote-Thread zu erzeugen)
    LET AHRechte$[3,0]=PROCESS_SET_SESSIONID
    LET AHRechte$[3,1]=($4)
    LET AHRechte$[4,0]=PROCESS_VM_OPERATION
    LET AHRechte$[4,1]=(Erlaubt Zugriff auf Prozessspeicher zu verändern)
    LET AHRechte$[5,0]=PROCESS_VM_READ
    LET AHRechte$[5,1]=(Erlaubt anderem Prozess Prozessspeicher zu lesen)
    LET AHRechte$[6,0]=PROCESS_VM_WRITE
    LET AHRechte$[6,1]=(Erlaubt anderem Prozess Prozessspeicher zu schreiben)
    LET AHRechte$[7,0]=PROCESS_DUP_HANDLE
    LET AHRechte$[7,1]=(Erlaubt Prozess-Handle zu kopieren)
    LET AHRechte$[8,0]=PROCESS_CREATE_PROCESS
    LET AHRechte$[8,1]=($80)
    LET AHRechte$[9,0]=PROCESS_SET_QUOTA
    LET AHRechte$[9,1]=($100)
    LET AHRechte$[10,0]=PROCESS_SET_INFORMATION
    LET AHRechte$[10,1]=(Erlaubt u.a. Priorität zu ändern)
    LET AHRechte$[11,0]=PROCESS_QUERY_INFORMATION
    LET AHRechte$[11,1]=(Erlaubt Prozessdaten (Exitcode/Priorität) auszulesen
    LET AHRechte$[12,0]=PROCESS_SUSPEND_RESUME
    LET AHRechte$[12,1]=($800)
    LET AHRechte$[13,0]=
    LET AHRechte$[13,1]=
    LET AHRechte$[14,0]=
    LET AHRechte$[14,1]=
    LET AHRechte$[15,0]=
    LET AHRechte$[15,1]=
    LET AHRechte$[16,0]=
    LET AHRechte$[16,1]=
    LET AHRechte$[23,0]=
    LET AHRechte$[23,1]=
    LET AHRechte$[24,0]=
    LET AHRechte$[24,1]=
    LET AHRechte$[25,0]=
    LET AHRechte$[25,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[27,0]=
    LET AHRechte$[27,1]=
    LET AHRechte$[32,0]=PROCESS_READ
    LET AHRechte$[32,1]=(Leserecht)
    LET AHRechte$[32,2]=$20410
    LET AHRechte$[33,0]=PROCESS_EXECUTE
    LET AHRechte$[33,1]=(Recht zum Ausführen und Durchsuchen)
    LET AHRechte$[33,2]=$120000
    LET AHRechte$[34,0]=PROCESS_WRITE
    LET AHRechte$[34,1]=(Schreibrecht)
    LET AHRechte$[34,2]=$020BEB

    IF @AND(F_PROC_USER$<>,@OR(@INSTR(+,Hinzu_entfernen$)>0,@INSTR(-,Hinzu_entfernen$)>0))

        Clear Needed&
        Clear F_SYS$,FSFlags&
        Clear ANZAHL_BYTES&
        Clear F_PROC_Zähler&,ACE_SIZE&
        Clear SecFlag&,ACCESS_MASK&
        Clear Vorhanden&,SecFlag&,NEEDED&
        Clear ACE_ZÄHLER&,SIZE_ACCOUNT&
        LET FSFlags&=0
        DIM STRSID#,500
        DIM P_STRSID#,4
        DIM Needed#,4
        LET FSFLAGS$= +@UPPER$(FSFLAGS$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_ALL,PROCESS_ALL_ACCESS)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_READ,PROCESS_READ)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_WRITE,PROCESS_WRITE)
        LET FSFLAGS$=@Translate$(FSFLAGS$,GENERIC_EXECUTE,PROCESS_EXECUTE)
        LET Ersatz$=PROCESS_SET_SESSIONID PROCESS_VM_OPERATION PROCESS_CREATE_THREAD PROCESS_VM_WRITE PROCESS_VM_READ PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_SET_QUOTA PROCESS_SET_INFORMATION  PROCESS_QUERY_INFORMATION PROCESS_SUSPEND_RESUME WRITE_DAC
        LET ERSATZ$=ERSATZ$+PROCESS_CREATE_PROCESS READ_CONTROL WRITE_OWNER SYNCHRONIZE READ_CONTROL PROCESS_TERMINATE _DELETE
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_ALL_ACCESS,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_EXECUTE,SYNCHRONIZE READ_CONTROL)
        LET Ersatz$=PROCESS_SET_INFORMATION PROCESS_SET_QUOTA PROCESS_SUSPEND_RESUME PROCESS_CREATE_PROCESS PROCESS_DUP_HANDLE
        LET ERSATZ$=ERSATZ$+PROCESS_VM_WRITE PROCESS_VM_OPERATION READ_CONTROL PROCESS_TERMINATE PROCESS_CREATE_THREAD
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_WRITE,Ersatz$)
        LET FSFLAGS$=@Translate$(FSFLAGS$,PROCESS_READ,PROCESS_QUERY_INFORMATION READ_CONTROL PROCESS_TERMINATE )

        IF @UPPER$(F_PROC_Process$)<>

            IF @VAL(F_PROC_Process$)<>0

                LET F_PROC_Process&=@VAL(F_PROC_Process$)

            Else

                THREAD_ID&=@AHGetWindowThreadProcessId(@FINDWINDOW(F_PROC_Process$),@ADDR(PROCESS_ID&))
                LET F_PROC_Process&=@AHOpenProcess($40000 | $20000,0,PROCESS_ID&)

            endif

        else

            LET F_PROC_Process&=@AHGetCurrentProcess()

        endif

        DIM SIDa#,1
        DIM PSECURITY_DESCRIPTOR#,1
        LET SECFLAG&=$1 | $2 | $4
        Long Needed#,0=1
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,1,Needed#)
        LET NEEDED&=@LONG(Needed#,0)
        Dispose PSECURITY_DESCRIPTOR#
        CLEAR NEEDED#
        CASE NEEDED&=0 : LET NEEDED&=1024
        DIM PSECURITY_DESCRIPTOR#,Needed&
        Clear PSECURITY_DESCRIPTOR#
        LET FILE_FEHLER&=@AHGetKernelObjectSecurity(F_PROC_Process&,SecFlag&,PSECURITY_DESCRIPTOR#,Needed&,Needed#)
        DIM ACL_PRESENT#,4
        DIM P_ACL#,4
        DIM ACL_D#,4
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET ANZAHL_BYTES&=8 Für ACL HEADER 8 Bytes veranschlagt

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    Sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2) Die Größen aller ACEs werden addiert.
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    DIM SID2#,ACE_SIZE&-8
                    clear SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#

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

                        @AHCopyMemory(STRSID#,@LONG(P_STRSID#,0),@AHLocalSize(@LONG(P_STRSID#,0)))
                        LET FILE_FEHLER&=@AHLocalFree(@LONG(P_STRSID#,0))

                    endif

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @AND(@BYTE(ACE#,0)=0,@INSTR(+,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                        IF @AND(@BYTE(ACE#,0)=1,@INSTR(-,Hinzu_entfernen$)>0)

                            LET VORHANDEN&=VORHANDEN& | 1

                        endif

                    endif

                    LET ACCESS_MASK&=@LONG(ACE#,4)
                    LET F_PROC_Zähler2&=0

                    While F_PROC_Zähler2&<36

                        sleep 10

                        IF @and(@or(ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@VAl(AHRechte$[F_PROC_Zähler2&,2])<>0)

                            LET ACCESS_MASK&=ACCESS_MASK&-@VAl(AHRechte$[F_PROC_Zähler2&,2])

                        endif

                        Let F_PROC_Zähler2&=F_PROC_Zähler2&+1

                    wend

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

                wend

            Endif

            Clear F_PROC_SID_NAME_USE#,F_PROC_ACCOUNT_NAME#,F_PROC_Domain#,SIDa#,F_SYS$
            Long F_PROC_SIZE_ACCOUNT#,0=1
            LONG SIZE_F_PROC_Domain#,0=256
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
            LET SIZE_ACCOUNT&=@LONG(F_PROC_SIZE_ACCOUNT#,0)
            Clear F_PROC_SID_NAME_USE#
            Clear F_PROC_ACCOUNT_NAME#
            Clear F_PROC_Domain#
            Long F_PROC_SIZE_ACCOUNT#,0=SIZE_ACCOUNT&
            LONG SIZE_F_PROC_Domain#,0=256
            Dispose SIDa#
            DIM SIDa#,SIZE_ACCOUNT&
            Clear SIDa#
            LET FILE_FEHLER&=@AHLookupAccountName(@ADDR(F_SYS$),@addr(F_PROC_USER$),SIDa#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)

            IF VORHANDEN&=0

                LET Anzahl_Bytes&=Anzahl_Bytes&+@LONG(F_PROC_SIZE_ACCOUNT#,0)+8 Alle ACEs+SID+ACCESS_MASK+ACE_HEADER

            endif

            IF @INSTR(0,Hinzu_entfernen$)>0

                LET Anzahl_Bytes&=@LONG(F_PROC_SIZE_ACCOUNT#,0)+8+8 SID+ACCESS_MASK+ACE_HEADER+ACL_HEADER

            endif

            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        Endif

        DIM NEW_ACL1#,Anzahl_Bytes&
        LET FILE_FEHLER&=@AHInitializeAcl(NEW_ACL1#,Anzahl_Bytes&,$2)
        Clear ACL_PRESENT#,P_ACL#,ACL_D#
        Let FILE_FEHLER&=@AHGetSecurityDescriptorDACL(PSECURITY_DESCRIPTOR#,ACL_PRESENT#,P_ACL#,ACL_D#)
        LET FILE_FEHLER&=@AHIsValidAcl(@long(P_ACL#,0))

        IF @INSTR(-,Hinzu_entfernen$)>0

            LET ACE_ZÄHLER&=1

        else

            LET ACE_ZÄHLER&=0

        endif

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

            DIM ACL_INFO#,12
            DIM P_ACE#,4
            CLEAR ACL_INFO#,P_ACE#
            Let FILE_FEHLER&=@AHGetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
            LET F_PROC_Zähler&=0
            DIM F_PROC_ACCOUNT_NAME#,256
            DIM F_PROC_SIZE_ACCOUNT#,4
            DIM F_PROC_Domain#,256
            DIM SIZE_F_PROC_Domain#,4
            DIM F_PROC_SID_NAME_USE#,4

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

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

                    sleep 10
                    sleep 10
                    Clear P_ACE#
                    Let FILE_FEHLER&=@AHGetAce(@long(P_ACL#,0),F_PROC_Zähler&,P_ACE#)
                    DIM ACE#,4
                    Clear ACE#
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),4)
                    LET ACE_SIZE&=@Word(ACE#,2)
                    LET ANZAHL_BYTES&=ANZAHL_BYTES&+ACE_SIZE&
                    Dispose ACE#
                    DIM ACE#,ACE_SIZE&
                    Clear F_PROC_SID_NAME_USE#
                    Clear F_PROC_ACCOUNT_NAME#
                    Clear F_PROC_Domain#
                    Clear ACE#
                    Long F_PROC_SIZE_ACCOUNT#,0=256
                    LONG SIZE_F_PROC_Domain#,0=256
                    @AHCopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
                    REM
                    DIM SID2#,ACE_SIZE&
                    CLEAR SID2#
                    @AHCopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
                    LET FILE_FEHLER&=@AHLookupAccountSid(@ADDR(F_SYS$),SID2#,F_PROC_ACCOUNT_NAME#,F_PROC_SIZE_ACCOUNT#,F_PROC_Domain#,SIZE_F_PROC_Domain#,F_PROC_SID_NAME_USE#)
                    Clear STRSID#
                    LET ACCESS_MASK&=@LONG(ACE#,4)

                    IF @UPPER$(@String$(F_PROC_ACCOUNT_NAME#,0))=@UPPER$(F_PROC_USER$)

                        IF @BYTE(ACE#,0)=0

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                CASE @INSTR(0,Hinzu_entfernen$)=0 : LET FSFlags&=ACCESS_MASK&

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                if @INSTR(0,Hinzu_entfernen$)=0

                                    LET F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                ENDIF

                            endif

                        Elseif @BYTE(ACE#,0)=1

                            IF @INSTR(+,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @AND(@or(ACCESS_MASK&,@val(AHRechte$[F_PROC_Zähler2&,2]))=ACCESS_MASK&,@INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0)

                                                LET ACCESS_MASK&=ACCESS_MASK&-@val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            ElseIF @INSTR(-,Hinzu_entfernen$)>0

                                IF @INSTR(0,Hinzu_entfernen$)=0

                                    LEt F_PROC_Zähler2&=0

                                    While F_PROC_Zähler2&<36

                                        sleep 10

                                        IF AHRechte$[F_PROC_Zähler2&,0]<>

                                            IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFLAGS$))>0

                                                LET ACCESS_MASK&=ACCESS_MASK& | @val(AHRechte$[F_PROC_Zähler2&,2])

                                            endif

                                        endif

                                        LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

                                    wend

                                    LONG ACE#,4=ACCESS_MASK&

                                    IF ACCESS_MASK&<>0

                                        LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                        LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                        LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                                    endif

                                endif

                            endif

                        endif

                    else

                        IF @INSTR(0,Hinzu_entfernen$)=0

                            IF ACCESS_MASK&<>0

                                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,ACE_SIZE&)
                                LET FILE_FEHLER&=@AHIsValidAcl(NEW_ACL1#)
                                LET ACE_ZÄHLER&=ACE_ZÄHLER&+1

                            endif

                        endif

                    endif

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

                wend

            Endif

            DIM ACE#,SIZE_ACCOUNT&+8

            IF @INSTR(+,Hinzu_entfernen$)>0

                Byte ACE#,0=0
                LET CFS$=Bei ALLOWED_ACE...

            ELSEIF @INSTR(-,Hinzu_entfernen$)>0

                Byte ACE#,0=1
                LET CFS$=Bei DENIED_ACE...

            endif

            LEt F_PROC_Zähler2&=0

            While F_PROC_Zähler2&<36

                sleep 10

                IF AHRechte$[F_PROC_Zähler2&,0]<>

                    IF @INSTR( +AHRechte$[F_PROC_Zähler2&,0],@UPPER$(FSFlags$))>0

                        LET FSFlags&=@OR(FSFLAGS&,@val(AHRechte$[F_PROC_Zähler2&,2]))

                    endif

                endif

                LET F_PROC_Zähler2&=F_PROC_Zähler2&+1

            wend

            Byte ACE#,1=0
            WORD ACE#,2=SIZE_ACCOUNT&+8
            LONG ACE#,4=FSFlags&
            LET F_PROC_Zähler&=0

            WHILE F_PROC_Zähler&<>SIZE_ACCOUNT&

                sleep 10
                BYTE ACE#,8+F_PROC_Zähler&=@BYTE(SIDa#,F_PROC_Zähler&)
                LET F_PROC_Zähler&=F_PROC_Zähler&+1

            WEND

            IF @INSTR(-,Hinzu_entfernen$)>0

                LET ACE_ZÄHLER&=0

            endif

            IF FSFlags&<>0

                LET FILE_FEHLER&=@AHAddAce(NEW_ACL1#,$2,ACE_ZÄHLER&,ACE#,SIZE_ACCOUNT&+8)

            Endif

            LET FILE_FEHLER&=@AHInitializeSecurityDescriptor(PSECURITY_DESCRIPTOR#,$1)
            DIM F_Ab_SD#,1
            DIM F_Ab_DACL#,1
            DIM F_Ab_SACL#,1
            DIM F_Ab_Owner#,1
            DIM F_Ab_PG#,1
            LET FILE_FEHLER&=@AHMakeAbsoluteSD(PSECURITY_DESCRIPTOR#,F_Ab_SD#,@ADDR(F_Ab_Size&),F_Ab_DACL#,@ADDR(F_Ab_DACLSize&),F_Ab_SACL#,@ADDR(F_Ab_SACLSize&),F_Ab_Owner#,@ADDR(F_Ab_OwnerSize&),F_Ab_PG#,@ADDR(F_Ab_PGSize&))
            Dispose F_Ab_SD#
            Dispose F_Ab_DACL#
            Dispose F_Ab_SACL#
            Dispose F_Ab_Owner#
            Dispose F_Ab_PG#
            DIM F_Ab_SD#,F_Ab_Size&+1
            DIM F_Ab_DACL#,F_Ab_DACLSize&+1
            DIM F_Ab_SACL#,F_Ab_SACLSize&+1
            DIM F_Ab_Owner#,F_Ab_OwnerSize&+1
            DIM F_Ab_PG#,F_Ab_PGSize&+1
            Clear F_Ab_SD#,F_Ab_DACL#,F_Ab_SACL#,F_Ab_Owner#,F_Ab_PG#
            LET FILE_FEHLER&=@AHMakeAbsoluteSD(PSECURITY_DESCRIPTOR#,F_Ab_SD#,@ADDR(F_Ab_Size&),F_Ab_DACL#,@ADDR(F_Ab_DACLSize&),F_Ab_SACL#,@ADDR(F_Ab_SACLSize&),F_Ab_Owner#,@ADDR(F_Ab_OwnerSize&),F_Ab_PG#,@ADDR(F_Ab_PGSize&))
            LET FILE_FEHLER&=@AHSetSecurityDescriptorDacl(F_Ab_SD#,1,NEW_ACL1#,0)
            LET FILE_FEHLER&=@AHSetKernelObjectSecurity(F_PROC_Process&,$4,F_Ab_SD#)
            @AHCloseHandle(F_PROC_Process&)
            Dispose F_SELF#
            Dispose F_Ab_SD#
            Dispose F_Ab_DACL#
            Dispose F_Ab_SACL#
            Dispose F_Ab_Owner#
            Dispose F_Ab_PG#
            DISPOSE ACE#
            Dispose F_PROC_ACCOUNT_NAME#
            Dispose F_PROC_SIZE_ACCOUNT#
            Dispose F_PROC_Domain#
            Dispose SIZE_F_PROC_Domain#
            Dispose F_PROC_SID_NAME_USE#
            Dispose P_ACE#
            Dispose ACL_INFO#

        endif

        Dispose PSECURITY_DESCRIPTOR#
        Dispose Needed#
        Dispose NEW_ACL1#
        ef='./../../function-references/XProfan/dispose/'>Dispose ACL_PRESENT#
        Dispose P_ACL#
        Dispose ACL_D#
        Dispose SIDa#
        Dispose STRSID#
        Dispose P_STRSID#

    endif

ENDPROC

 
26.03.2006  
 



répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

6.047 Views

Untitledvor 0 min.
Jens-Arne Reumschüssel08.07.2022
maroro13.04.2018
W.L.05.07.2017
p.specht30.03.2017
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie