Forum | | | | - Seite 1 - |
| | Hallo Profaner...
Ich habe vor, mich demnächst mal etwas mäher mit der NT/NTFS File-Security zu beschäftigen - anzeigen und ändern von Eigentümern und son Zeug zum Beispiel. Hat jemand so etwas schon mal gemacht (mit Security Descriptors gearbeitet) oder gibt es Interesse an dem Thema? |
| | | | |
| | | | - Seite 4 - |
| | | OK - jetzt bist du dran. Füge mal vor der besagten Zeile eine Editbox ein und lasse dir die Werte ausgeben - ich denke mein Verdacht wird sich bestätigen. |
| | | | |
| | CB | Das Blöde daran ist, daß ich auf unserem Firmen-PC keine eindeutige Zeilenzuordnung treffen kann - ich kanns dort verständlicherweise nur kompiliert testen und auf meinem privaten PC kriege ich diese Fehlermeldung gar nicht. Welchen Befehl hast Du da im Verdacht? Und wieso kriege ich diesen Fehler nur mit Benutzerrechten?
Christian |
| | | | |
| | Ragnar Rehbein | warum compilierst du nicht mit XPSE ???
ich habe zu jeder version die ich im einsatz habe die entsprechenden .enh - datei gespeichert. dadurch habe ich immer die richtige zeile bei fehlermeldungen parat.
ich hartnäckigen fällen (windowsschutzverletzungen) übersetze ich mit {$debug kernelout} und lasse mir den quellcode mit debugview anzeigen.
r.r. |
| | | | |
| | | Hallo Christian...
Ich glaube, ich habe dich die ganze Zeit nicht richtig verstanden: Du hast die Probleme also auf deinem Firmen-PC, und dort bist du nur ein User mit eingeschränkten Rechten und kein Admin?
Ich setze hier in meinem Code Systemeinstellungen. Damit nicht jeder Schwachkopf im System herumfummeln kann, sind die Systemeinstellungen durch Privilegien abgesichert.
Um dir die Daten des Security Descriptors über die API anzeigen zu lassen, muss dein Account das Privileg SeSecurityPrivilege besitzen. Der Besitz dieses Privilegs wird u.a. durch die Gruppe geregelt, der dein Account angehört (Administrator oder Benutzer mit eingeschränkten Rechten). In der Regel sind Privilegien deaktiviert, d.h. auch Admins können nicht ohne weiteres Systemeinstellungen über die API ändern.
In meinem Quelltext aktiviere ich mit AdjustTokenPrivileges die Privilegien im Token des aufrufenden Programms. Der Token ist ein einem Prozess (Programm) zugeordneter Speicherbereich, der Infos über den User enthält, der gerade das Programm ausführt - sich also eingeloggt hat.
Ich schätze mal, du hast das Privileg gar nicht, das ich hier aktivieren will... Als Folge davon liefert GetFileSecurity nur Müll zurück. Da GetFileSecurity u.a. die Größe des Security Descriptors ausliest, ist Needed& wohl 0. Bei DIM PSECURITY_DESCRIPTOR#,Needed& wird also der Bereich nicht richtig dimensioniert. Unter 2000 macht dss keine Probleme, ich könnte mir aber vorstellen, daß XP da etwas anders reagiert.
Ich habe noch einmal etwas geändert und will hoffen, das jetzt die Fehlermeldungen ausbleiben.
Error 997 ist übrigens nichts Schlimmes, solange die aufrufende Funktion den Erfolg meldet. KompilierenMarkierenSeparierenWindowstyle 31
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
DEF @SetLastError(1) !"KERNEL32","SetLastError"
DEF @LookupPrivilegeName(4)!"advapi32","LookupPrivilegeNameA" Ermittelt aus dem Luid eines Privilegs dessen Namen.
DEF @LookupPrivilegeValue(3) !"advapi32","LookupPrivilegeValueA" Ermittelt aus dem Namen eines Privilegs dessen Luid.
DEF @OpenProcessToken(3) !"advapi32","OpenProcessToken" Öffnet Einstellprozess.
DEF @AdjustTokenPrivileges(6) !"advapi32","AdjustTokenPrivileges" Stellt Privilegien ein.
DEF @GetCurrentProcess(0) !"kernel32","GetCurrentProcess" Ermittel das Handle des aktiven Prozesses.
DEF @CloseHandle(1) !"kernel32","CloseHandle" Schließt ein Handle (Programm).
Def @GetVolumeInformation(8) !"KERNEL32","GetVolumeInformationA"
DEF @GetSecurityDescriptorOwner(3) !"ADVAPI32","GetSecurityDescriptorOwner"
DEF @GetSecurityDescriptorGroup(3) !"ADVAPI32","GetSecurityDescriptorGroup"
DEF @GetSecurityDescriptorDACL(4) !"ADVAPI32","GetSecurityDescriptorDacl"
DEF @LookupAccountSid(7) !"ADVAPI32","LookupAccountSidA"
DEF @IsValidSecurityDescriptor(1) !"ADVAPI32","IsValidSecurityDescriptor"
DEF @IsValidSid(1) !"ADVAPI32","IsValidSid"
DEF @IsValidAcl(1) !"ADVAPI32","IsValidAcl"
DEF @GetAclInformation(4) !"ADVAPI32","GetAclInformation"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
DEF @GetAce(3) !"ADVAPI32","GetAce"
DEF @ConvertSidToStringSid(2) !"ADVAPI32","ConvertSidToStringSidA"
DEF @LocalFree(1) !"KERNEL32","LocalFree"
Declare Filename$,Fehler&,PSECURITY_DESCRIPTOR#,Needed#,Needed&
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
DEclare SID#,GFLAG#
DEclare ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#
Declare Test&
Declare DACL_PRESENT#,P_ACL#,DACL_D#
Declare ACL_INFO#,Zähler&,ACE#,P_ACE#,ACE_SIZE&,STRSID#,P_STRSID#
Declare SID2#,IO%,ADDR_NEWSTATE&
LET Filename$=@LOADFILE$("Datei laden","Alle Dateien |*.*|Textdateien|*.TXT")
IF Filename$<>""
CLEARLIST
LET LAUFWERK$=@LEFT$(Filename$,3)
DIM Label#,256
DIM LFLAGS#,4
DIM DAT#,256
DIM STRSID#,256
DIM P_STRSID#,4
ADDSTRING "Gewählte Datei="+Filename$
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET FEHLER&=@GetVolumeInformation(@ADDR(Laufwerk$),Label#,256,0,0,LFlags#,DAT#,256)
ADDSTRING "Rückgabe von GetVolumeInformation="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Laufwerksflags="+@BIN$(@LONG(LFLAGS#,0))
IF @LONG(LFLAGS#,0) | $8 = @LONG(LFLAGS#,0)
ADDSTRING "Zugriff ist einschränkbar"
else
ADDSTRING "Zugriff ist nicht einschränkbar"
endif
ADDSTRING "Ausgelesene Partition="+@String$(Dat#,0)
dim token#,4
DIM NewState#,16
DIM Luid#,8
DIM Privileg#,33
ADDSTRING "Windowsversion="+$WINVER
Long NewState#,0=1 Nur ein Privileg soll geändert werden
Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
LET FEHLER&=@OpenProcessToken(@GetCurrentProcess(),$0020 | $0008,Token#)
ADDSTRING "Rückgabe von OpenProcessToken="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Clear Privileg#
Clear LUID#
STRING Privileg#,0="SeSecurityPrivilege"
LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
ADDSTRING "Rückgabe von LookupPrivilegeValue für SeSecurityPrivilege="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
LET ADDR_NEWSTATE&=NewState#
LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
@CopyMemory(ADDR_NEWSTATE&,Luid#,8)
ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Clear NewState#
Long NewState#,0=1 Nur ein Privileg soll geändert werden
Long NewState#,12=$00000002 Das Privileg soll eingeschaltet werden
Clear Privileg#
Clear LUID#
STRING Privileg#,0="SeTakeOwnershipPrivilege"
LET Fehler&=@LookupPrivilegeValue(@addr(System$),Privileg#,LUID#)
ADDSTRING "Rückgabe von LookupPrivilegeValue fur SeTakeOwnershipPrivilege="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
LET ADDR_NEWSTATE&=NewState#
LET ADDR_NEWSTATE&=ADDR_NEWSTATE&+4
@CopyMemory(ADDR_NEWSTATE&,Luid#,8)
ADDSTRING "Letzter API-Fehler nach CopyMemory="+@STR$(@GetLastError())
Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
DIM Needed#,4
Clear Needed#
LET Fehler&=@GetFileSecurity(@ADDR(Filename$),$1 | $2 | $4 | $8,0,0,Needed#)
ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET NEEDED&=@LONG(Needed#,0)
ADDSTRING "Erforderliche Länge des Security Descriptor="+@STR$(Needed&)
CASE NEEDED&=0 : LET NEEDED&=1024
DIM PSECURITY_DESCRIPTOR#,Needed&
Clear PSECURITY_DESCRIPTOR#
@SetLastError(0)
LET Fehler&=@GetFileSecurity(@ADDR(Filename$),$1 | $2 | $4,PSECURITY_DESCRIPTOR#,NEEDED&,Needed#)
ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET Fehler&=@IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR#)
ADDSTRING "Rückgabe von IsValidSecurityDescriptor="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
DIM SID#,4
DIM GFlag#,4
Clear SID#
Clear GFLAG#
LET FEHLER&=@GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
ADDSTRING "Rückgabe von GetSecurityDescriptorOwner="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET Fehler&=@IsValidSid(@long(SID#,0))
ADDSTRING "Rückgabe von IsValidSid für den Besitzer="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
DIM ACCOUNT_NAME#,256
DIM SIZE_ACCOUNT#,4
DIM Domain#,256
DIM SIZE_DOMAIN#,4
DIM SID_NAME_USE#,4
Clear SID_NAME_USE#
Clear ACCOUNT_NAME#
Clear Domain#
Long SIZE_ACCOUNT#,0=255
LONG SIZE_DOMAIN#,0=255
LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
ADDSTRING "Domainname="+@String$(Domain#,0)
ADDSTRING "Besitzer der Datei="+@String$(ACCOUNT_NAME#,0)
Clear STRSID#
IF @VAL(@LEFT$($WINVER,3))>=5.0
LET FEHLER&=@ConvertSidToStringSid(@Long(SID#,0),P_STRSID#)
@CopyMemory(STRSID#,@LONG(P_STRSID#,0),255)
ADDSTRING "String-SID des Besitzers="+@STRING$(STRSID#,0)
ADDSTRING "Rückgabe von ConvertSidToStringSid="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
endif
LET Fehler&=@LocalFree(@LONG(P_STRSID#,0))
ADDSTRING "Rückgabe von LocalFree für den String-SID="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Clear SID_NAME_USE#
Clear ACCOUNT_NAME#
Clear Domain#
Clear SID#
Clear GFLAG#
LET FEHLER&=@GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR#,SID#,GFLAG#)
ADDSTRING "Rückgabe von GetSecurityDescriptorGroup="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET Fehler&=@IsValidSid(@long(SID#,0))
ADDSTRING "Rückgabe von IsValidSid für die primäre Gruppe="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Long SIZE_ACCOUNT#,0=255
LONG SIZE_DOMAIN#,0=255
LET FEHLER&=@LookupAccountSid(@ADDR(System$),@Long(SID#,0),ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
ADDSTRING "Domainname="+@String$(Domain#,0)
ADDSTRING "Primäre Gruppe der Datei="+@String$(ACCOUNT_NAME#,0)
DIM DACL_PRESENT#,1
DIM P_ACL#,4
DIM DACL_D#,4
Let Fehler&=@GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR#,DACL_PRESENT#,P_ACL#,DACL_D#)
ADDSTRING "Rückgabe von GetSecurityDescriptorDacl="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
LET Fehler&=@IsValidAcl(@long(P_ACL#,0))
ADDSTRING "Rückgabe von IsValidAcl für den DACL="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
IF Fehler&=1
DIM ACL_INFO#,12
DIM P_ACE#,4
CLEAR ACL_INFO#
Let Fehler&=@GetAclInformation(@long(P_ACL#,0),ACL_INFO#,12,2)
ADDSTRING "Rückgabe von GetAclInformation="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "ACEs in ACL="+@STR$(@LONG(ACL_INFO#,0))
LET Zähler&=0
IF @STR$(@LONG(ACL_INFO#,0))<>0
While Zähler&<@LONG(ACL_INFO#,0)
Clear P_ACE#
Let Fehler&=@GetAce(@long(P_ACL#,0),Zähler&,P_ACE#)
DIM ACE#,4
Clear ACE#
@CopyMemory(ACE#,@LONG(P_ACE#,0),4)
LET ACE_SIZE&=@Word(ACE#,2)
ADDSTRING "Größe des "+@STR$(@INT(Zähler&+1))+".ACEs="+@STR$(@Word(ACE#,2))
IF @BYTE(ACE#,0)=0
ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_ALLOWED_ACE_TYPE"
ElseIF @BYTE(ACE#,0)=1
ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=ACCESS_DENIED_ACE_TYPE"
ElseIF @BYTE(ACE#,0)=2
ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_AUDIT_ACE_TYPE"
ElseIF @BYTE(ACE#,0)=3
ADDSTRING "ACE Typ des "+@STR$(@INT(Zähler&+1))+".ACEs=SYSTEM_ALARM_ACE"
endif
Dispose ACE#
DIM ACE#,ACE_SIZE&
Clear SID_NAME_USE#
Clear ACCOUNT_NAME#
Clear Domain#
Clear ACE#
Long SIZE_ACCOUNT#,0=255
LONG SIZE_DOMAIN#,0=255
@CopyMemory(ACE#,@LONG(P_ACE#,0),ACE_SIZE&)
DIM SID2#,ACE_SIZE&-8
@CopyMemory(SID2#,@LONG(P_ACE#,0)+8,ACE_SIZE&-8)
LET FEHLER&=@LookupAccountSid(@ADDR(System$),SID2#,ACCOUNT_NAME#,SIZE_ACCOUNT#,Domain#,SIZE_DOMAIN#,SID_NAME_USE#)
ADDSTRING "Rückgabe von LookupAccountSid="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
ADDSTRING "Reset des API-Fehlers wird durchgeführt"
@SetLastError(0)
LET IO%=%IORESULT
ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf SID="+@String$(ACCOUNT_NAME#,0)
ADDSTRING @STR$(Zähler&)+". ACE Bezogen auf Domainname="+@String$(Domain#,0)
ADDSTRING "Accessrechte des "+@STR$(Zähler&)+". ACEs=$"+@HEX$(@LONG(ACE#,4))
LET Zähler&=Zähler&+1
Dispose SID2#
Dispose ACE#
wend
Endif
Endif
LET FEHLER&=@CloseHandle(@LONG(Token#,0))
ADDSTRING "Rückgabe von CloseHandle="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Dispose P_ACE#
Dispose ACL_INFO#
Dispose DACL_D#
Dispose P_ACL#
Dispose DACL_PRESENT#
Dispose SID_NAME_USE#
Dispose ACCOUNT_NAME#
Dispose SIZE_ACCOUNT#
Dispose Domain#
Dispose SIZE_DOMAIN#
Dispose SID#
Dispose GFLAG#
Dispose Luid#
Dispose Privileg#
Dispose NewState#
Dispose token#
Dispose Needed#
Dispose PSECURITY_DESCRIPTOR#
Dispose Label#
Dispose LFlags#
DISPOSE DAT#
Dispose STRSID#
Dispose P_STRSID#
@Editbox("API Rückgaben",1)
Endif
While 0=0
Waitinput
Wend
Das zweite Privileg, das ich hier aktiviere, ist übrigens nötig, um übrigens dazu nötig, um den Eigentümer zu ändern... |
| | | | |
| | CB | Das 1. mache ich ja - dadurch stimmen ja die Zeilennummern in der .enh nicht mehr mit dem ursprünglichen Code überein - in der enh stehen alle Declares in der 1. Zeile, wo stehen die in der .prc? Da verschiebt sich alles ein bißchen. Debuggen kann ich in der Fa nicht, weil ich dort kein Profan installieren kann - wenn die rauskriegen, daß ich da fremde Progs installiere, außerdem habe ich dort nur Benutzerrechte ...
Christian |
| | | | |
| | | Hallo Christian...
Brauchst du dort auch nicht testen - ich habe bloß die ganze Zeit gedacht, du hättest das Problem auf deinem Rechner zu Hause - als Admin. Dass das nicht mit allen Useraccount funktioniert, ist vollkommen klar und auch nachzuvollziehen - und dem brauchen wir auch nicht weiter nachzugehen - also nur zu Hause testen. Ich habe dir ja schon mal gesagt - ist alles nichts für Hacker, nur für Admins.
Ich werde mich demnächst noch in den SACL reinknien und dann werden alle Werte noch geändert...
Die Zeilennummer stimmt u.a. wegen der Leerzeilen nicht. |
| | | | |
| | CB | Erspart mir etwas Arbeit - aber interessiert hätts mich schon, wieso diese Fehlermeldung nur mit Benutzerrechten auftritt...
Christian |
| | | | |
| | Ragnar Rehbein | eine andere nette option ist die compileroption -M bei XProfan9. dann wird eine mapdatei für die zeilennummern erzeugt.
diese sollte beim finden der fehlerhaften zeile helfen. habe ich bisher aber nur kurz getestet. kann also nicht sagen wie genau sie ist.
r.r. |
| | | | |
| | | Hallo Christian...
Die Erklärung, die ich im Augenblick habe, habe ich ja schon gepostet. Wenn dem so ist, dürfte der Fehler seit dem letzten Quelltext behoben sein.
Noch eine ganz blöde Frage:
Als ich mich vor einer Zeit mit den Privilegien und danach mit der LSA-Security-API beschäftigt habe, habe ich so den Eindruck bekommen, daß niemand von den XP und 2000 Fans (scheinbar Roland auch nicht) einen blassen Schimmer davon hat, wie das Betriebsystem überhaupt in etwa arbeitet. Selbst die Sachen, die du über die Registry erkannt hast, scheint hier kaum jemand ( - oder außer uns beiden gar keiner?) zu wissen - oder die, die das wissen, behalten Ihr Wissen für sich.
In wie weit hast du verstanden, was da im Quelltext - und darauf bezogen im Betriebssystem - bislang abläuft, oder sind das alles böhmishe Dörfer für dich? Es geht mir nicht um die Funktion jeder API, sondern nur darum, was dort im Prinzip passiert... |
| | | | |
| | | Hallo Ragnar...
Besten Dank für den Hinweis, aber zumindestens ich arbeite noch mit Profan 7.5 . In wie weit hast du Einblick in die Security? Ich habe langsam so den Eindruck, das ich der einzige bin, der sich jemals damit beschäftigt hat... |
| | | | |
| | CB | Hallo Andreas! Was die Security angeht: Ich habe mich schon vor Jahren ein bissel mit Netzwerken und Rechtevergaben etc. auseinandergesetzt und habe dadurch schon eine ungefähre Vorstellung, bloß reicht die leider nicht aus, um Dir eine große Hilfe sein zu können, schon eher mit der Registry - mit der habe ich mich etwas intensiver befasst. Außerdem hats mich immer schon interessiert, was da im Hintergrund so abläuft, zB beim Zugriff auf eine Datei, wo innerhalb einer Sekunde ein paar tausend Schreib- und Lesezugriffe auf die Reg. stattfinden. Gibt ja ganz nette Tools dazu, von [...] beispielsweise... Speziell TokenMon (geht leider nur unter NT und 2000) könnte ich mir vorstellen daß sie uns weiterhilft. Christian |
| | | | |
| | | Hallo Christian...
Das du dich gut in der Registry auskennst habe ich mir schon gedacht. Ich habe deswegen einen SID auch in Stringform dastellen lassen => siehe auch dazu HKEY_USERS. Wo gibts diese Tools? Sieht sehr schick aus! Wenn dir da sonst irgenwas unklar ist - frag mich einfach. Ich denke, ich habs verstanden.
Hilfe werde ich wohl kaum benötigen - die Sache entpuppt sich als wesentlich einfacher als alles andere, was ich bislang im Securitybereich zusammengeschustert habe.
Was ich noch bräuchte, wäre eine möglichst vollständige Liste aller User und Gruppen eines Systems. An die User bin ich bislang immer so herangekommen: - Unter HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionProfileListProfilesDirectory lese ich den Pfad asus, in dem die Userprofile gespeichert sind. - Ich suche dann dort nach den vorhandenen Verzeichnissen. - Zur Zeit sehe ich dann nach, ob in diesem Verzeichnis eine NTUSER.DAT existiert. Besser wäre jedoch dann LookupAccountName und IsValidSid zu verwenden, um zu testen, ob das Verzeichnis der Loginname eines Users ist.
Du scheinst da in der Registry auch einiges über die Gruppen gefunden zu haben - eine Idee wie man die listen könnte? |
| | | | |
|
AntwortenThemenoptionen | 5.632 Betrachtungen |
ThemeninformationenDieses Thema hat 6 Teilnehmer: |