Forum | | | | | 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? |
| | | | |
| | | Nun auf Linux ist alles ja zum Glück über bashscripz realisierbar - da isses alles net so kompliziert - aber irgendwie sicherer.
Interessant wäre z.B. wie eine auf einem Client-Laufende-Software sich als Benutzer auf dem Server anmelden kann (vorrausgesetzt Username+Passwort vorhanden!) um Dateien je nach Rechtevergebung auf dem Server zu behandeln.
Salve. |
| | | | |
| | | Moin IF...
Sich irgendwo als anderer User anzumelden (und sei es nur mit einem einzelnen Prozess), dürfte eigentlich kein Problem sein (siehe API Library). Leider habe ich kein privates Netzwerk und kann deshalb dazu nichts entwickeln - allerhöchstens mitdenken. Die Domain (Computername) muss übrigens auch noch bekannt sein. Das ändern des Security Descriptors ist dann aber gar nicht mehr notwendig - und gerade das möchte ich ja. Ich möchte Files und Registry-Keys nur für bestimmte User und Gruppen freigeben oder den Eigentümer auf (einen evtl. geänderten) Loginnamen anpassen.
Viele Installer scheitern bei Usern mit eingeschränkten Rechten, weil diese bei der Installation eines Programmes nicht die Zugriffsrechte für die Files des installierten Programmes anpassen. Installiert ein Admin für einen User mit eingeschränkten Rechten ein Programm, funktioniert dieses dann evtl. nicht richtig, weil Files nicht gelesen oder geschrieben werden können - ein Problem, an das kaum ein Programmierer denkt.
Der Zugriff auf den Security Descriptor scheint auch unter Windows nicht so kompliziert zu sein - ist wesentlich besser dokumentiert als die Aktivierung von Privilegien und die LSA - und beides ist bereits in Profan umgesetzt.
Trotzdem scheint es kaum oder gar keine Quelltexte in irgendeiner Programmiersprache über das Ändern von Security Descriptors zu geben - das stört mich etwas und das will ich ändern...
´ |
| | | | |
| | | Du möchtest also einen set|getFileOwner erstellen - um vor einem fopen ein getFileOwner==actualOwner abprüfen zu können?
Wäre sehr interessant...
Salve. |
| | | | |
| | | Hallo IF...
Ja, genau. Nur das ich mit dieser Aufgabe eigentlich nicht viel zu tun habe - das übernimmt das Betriebssystem für mich, vorausgesetzt es gibt eine NTFS formatierte Patition (bei XP eigentlich schon fast Standard).
In der Registry funktioniert das auf die gleiche Weise. Auch hier können Keys gegen Fremdzugriff geschützt werden. Bei einigen Systemkeys unter HKEY_LOCAL_MACHINE ist es standardmäßig so, daß eigentlich nur Admins darauf zugreifen können.
Wie gesagt - wäre das für Files gelöst, könnte man das für alle anderen Bereiche des Betriebsystems auch anwenden. Da ich hier nur bedinngt über NTFS Partitionen verfüge, bräuchte ich evtl. ein bis zwei Leute, die etwas enger mit mir zusammenarbeiten und 2000 oder XP mit NTFS haben. Oberflächliche Kenntnisse, wie diese Betriebssysteme funktionieren, sollte man schon mitbringen.
Die Delphianer haben etwas ähnliches versucht - ist da scheinbar wohl kläglich in die Hose gegangen. Ich denke mal, wir kriegen das geregelt. |
| | | | |
| | | Du weißt doch - wenns was zu testen gibt...
Salve. |
| | | | |
| | CB | Hallo, Andreas!
Bin gerne auch dabei. XP - 2000 - NT, auch im Netzwerk. Tät mich auch interessieren!
Ciao, Christian |
| | | | |
| | | Hallo ihr beiden...
Bestens - sobald ich wieder voll an meinen Internet-PC kann, gehts genau hier los. Das kann noch bis zu 14 Tagen dauern, deshalb etwas Geduld.
Ich habe vor, ähnlich wie bei der LSA-API und dem Aktivieren von Privilegien, hier sehr tief in das Herz jedes Windows NT-basieten Betriebssystems zu blicken.
Wenn dabei etwas vernünftiges herauskommt, wird das Ergebnis nicht nur für Files gelten, sondern auf alle Bereiche eines NT-basierten Systems zutreffen, die mit ACCESS_MASK Flags arbeiten - die Registry unter anderem, um nur ein Beispiel von vielen zu nennen.
Ich freue mich schon auf die Zusammenarbeit mit euch und hoffe, daß ihr mir auch etwas auf die Sprünge helfen könnt, wenns bei mir haken sollten... |
| | | | |
| | | Hallo ihr beiden (und dem Rest ebenso)...
OK, jetzt fangen wir mal ganz langsam und einfach an:
Zuerst hole ich mir den Security Descriptor - also noch nichts besonderes.
Welche Rückmeldungen gibts - was zeigt die Ausgabebox an - ist irgendetwas unschlüssig? KompilierenMarkierenSeparierenWindowstyle 31
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
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"
Declare Filename$,Fehler&,SECURITY_INFORMATION#,PSECURITY_DESCRIPTOR#,Needed#
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
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
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())
STRING Privileg#,0="SeSecurityPrivilege"
LET Fehler&=@LookupPrivilegeValue(System$,Privileg#,LUID#)
ADDSTRING "Rückgabe von LookupPrivilegeValue="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Byte NewState#,4=@Byte(Luid#,0)
Byte NewState#,5=@Byte(Luid#,1)
Byte NewState#,6=@Byte(Luid#,2)
Byte NewState#,7=@Byte(Luid#,3)
Byte NewState#,8=@Byte(Luid#,4)
Byte NewState#,9=@Byte(Luid#,5)
Byte NewState#,10=@Byte(Luid#,6)
Byte NewState#,11=@Byte(Luid#,7)
Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
DIM SECURITY_INFORMATION#,4
DIM PSECURITY_DESCRIPTOR#,1024
DIM Needed#,4
LONG SECURITY_INFORMATION#,0=$1 | $2 | $4
LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SECURITY_INFORMATION#,PSECURITY_DESCRIPTOR#,1024,Needed#)
ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
@CloseHandle(@LONG(Token#,0))
Dispose Luid#
Dispose Privileg#
Dispose NewState#
Dispose token#
Dispose Needed#
Dispose PSECURITY_DESCRIPTOR#
Dispose SECURITY_INFORMATION#
Dispose Label#
Dispose LFlags#
DISPOSE DAT#
@Listbox$("API Rückgaben",1)
Endif
While 0=0
Waitinput
Wend
Fragen zu irgendwelchen Sachen? Gibt es irgendo 997 Fehlermeldungen? Kann sich das jemand erklären??? |
| | | | |
| | Rolf Koch | Hi AH hab einfach mal ne *.txt Datei gewählt.
bei mir kommt nach LookupPrivilegeValue=1 der Wert 997. Erklären kann ich dies aber nicht, da ich keinen Schimmer davon habe
Rolf |
| | | | |
| | | Hey Rolf...
Scheint aber trotzdem zu funktionieren => Rückmeldung ist ja 1. Wie siehts mit den anderen Rückmeldungen aus?
Ziel der Kiste = Ich will bei der Installation eines Programms festlegen können, welche User in welcher Art und Weise Zugriff auf die installierten Dateien haben. Normalerweise wird der Zugriff von übergeordneter Stelle vererbt. Das kann bei eingeschränkten Rechten zu ganz erheblichen Problemen führen... |
| | | | |
| | Rolf Koch | Also sieht bei mir so aus: KompilierenMarkierenSeparieren Und da ich zu faul bin alles abzutippen, was in der Liste steht, habe ich Deinen Code ein bisschen um Arbeitselemente erweitert KompilierenMarkierenSeparierenWindowstyle 31
Windowtitle "File Security"
Window 0,0-640,440
DEF @GetFileSecurity(5) !"ADVAPI32","GetFileSecurityA"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
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"
Declare Filename$,Fehler&,SECURITY_INFORMATION#,PSECURITY_DESCRIPTOR#,Needed#
Declare NewState#,token#,Privileg#,Luid#,System$
Declare Laufwerk$,Label#,LFLAGS#,DAT#
DECLARE LISTBOX&,TOCLIP&,TOCLIP$
LISTBOX&=CREATELISTBOX(%HWND,"",5,5,500,300)
TOCLIP&=CREATEBUTTON(%HWND,"CLIPBOARD",5,320,120,18)
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
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())
STRING Privileg#,0="SeSecurityPrivilege"
LET Fehler&=@LookupPrivilegeValue(System$,Privileg#,LUID#)
ADDSTRING "Rückgabe von LookupPrivilegeValue="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
Byte NewState#,4=@Byte(Luid#,0)
Byte NewState#,5=@Byte(Luid#,1)
Byte NewState#,6=@Byte(Luid#,2)
Byte NewState#,7=@Byte(Luid#,3)
Byte NewState#,8=@Byte(Luid#,4)
Byte NewState#,9=@Byte(Luid#,5)
Byte NewState#,10=@Byte(Luid#,6)
Byte NewState#,11=@Byte(Luid#,7)
Let Fehler&=@AdjustTokenPrivileges(@LONG(Token#,0),0,NewState#,0,0,0)
ADDSTRING "Rückgabe von AdjustTokenPrivileges="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
DIM SECURITY_INFORMATION#,4
DIM PSECURITY_DESCRIPTOR#,1024
DIM Needed#,4
LONG SECURITY_INFORMATION#,0=$1 | $2 | $4
LET Fehler&=@GetFileSecurity(@ADDR(Filename$),SECURITY_INFORMATION#,PSECURITY_DESCRIPTOR#,1024,Needed#)
ADDSTRING "Rückgabe von GetFileSecurity="+@STR$(Fehler&)
ADDSTRING "Letzter API-Fehler="+@STR$(@GetLastError())
@CloseHandle(@LONG(Token#,0))
MOVELISTTOLIST(LISTBOX&)
Dispose Luid#
Dispose Privileg#
Dispose NewState#
Dispose token#
Dispose Needed#
Dispose PSECURITY_DESCRIPTOR#
Dispose SECURITY_INFORMATION#
Dispose Label#
Dispose LFlags#
DISPOSE DAT#
Endif
While 0=0
Waitinput
IF GETFOCUS(TOCLIP&)
CLEARCLIP
CLEAR TOCLIP$
TOCLIP$=GETSTRING$(LISTBOX&,0)
WHILELOOP GETCOUNT(LISTBOX&)
TOCLIP$=TOCLIP$+CHR$(10)+GETSTRING$(LISTBOX&,&LOOP)
WEND
PUTCLIP TOCLIP$
ENDIF
Wend
Rolf |
| | | | |
|
AntwortenThemenoptionen | 5.731 Betrachtungen |
ThemeninformationenDieses Thema hat 6 Teilnehmer: |