| Moin todos zusammmen...
Längst no cada User ha Zugriff en todos Registryschlüssel - auch el es beim Erstellen de Programmen a bedenken. Vertraut also alguien darauf, daß una User con eingeschränkten Rechten ebenfalls todos Keys bajo HKEY_LOCAL_MACHINE auslesen kann, podría él como evtl. en Sand gebaut haben. Yo veces a la pequeño Ver código fuente para Spielen geschrieben: KompilierenMarcaSeparación $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
@./../funktionsreferenzen/XProfan/editbox/'>Editbox(API Rückgaben,1)
Disponer RegHandle#
Sinestar encargado %MENUITEM=-2
Waitinput
Wend
Welche Fragen Yo: - Yo arbeite en el Regel sólo Windows95/98. Gibt lo en NT/2000/XP irgendwelche Systemprogramme, el esta Rechte en el Registry auflisten? - Gibt lo todavía mehr Registryrechte como el, el Yo en el Ver código fuente berechnen lasse? Reine Kombinationsflags veces salvo... - Wird en irgendeinem Registryschlüssel irgendwo una SACL adecuado? - Sombrero irgendjemand Fragen para Ver código fuente? |
|