| Autor |
Beitrag |
Cronen
Hält's aus hier
Beiträge: 2
Turbo Delphi W32 Prof
|
Verfasst: Fr 05.09.03 12:59
Hallo,
Ich möchte in ein Programm in einem Win2000-Netzwerk vor unebrechtigten Zugriff schützen.Die Zugriffskontrolle soll dabei im Hintergrund unbermerkt durch den Anwender auf Grundlage der Benutzerverwaltung von Windows 2000 stattfinden. Das Programm soll nur starten wenn der im System angemeldete User einer bestimmten Beutzergruppe angehört.
Und hier liegt mein Problem: Den User festzustellen kann ich mit der Funktion GetUserName. Aber wie stelle ich fest ob dieser User dieser Gruppe gehöhrt?
Hier bin ich nicht fündig geworden. Wer kann mir helfen? (Da ich kein Profi bin wenns geht mit Code)
|
|
lemming
      
Beiträge: 470
Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
|
Verfasst: Mi 10.09.03 13:52
Es gibt unter Windows das kleine Programm
net.exe. Damit läßt sich allerlei unfug treiben.
Z.B. alle User eine Gruppe ausgeben:
Quelltext 1:
| net group GG-Programmierung /domain |
Du musst das Ergebniss nur noch per Capture abfangen. oder lässt es gleich in eine Textdatei schreiben.
Quelltext 1:
| net group GG-Programmierung /domain >gruppe.txt |
-lemming
|
|
barfuesser
      
Beiträge: 324
|
Verfasst: Mi 10.09.03 14:37
| Zitat: |
It is often useful to know if the account under which your application is
running is a member of the "Administrators" group. The sample code below
demonstrates a method of making this determination:
Sample Code
-----------
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| BOOL IsAdmin(void) { HANDLE hProcess, hAccessToken; UCHAR InfoBuffer[1024]; PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer; DWORD dwInfoBufferSize; SID_NAME_USE snuInfo; UCHAR szAccountName[256], szDomainName[256];
DWORD dwAccountNameSize, dwDomainNameSize; UINT x;
hProcess = GetCurrentProcess();
if(!OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken)) return(FALSE);
if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer, 1024, &dwInfoBufferSize)) return(FALSE);
for(x=0;x<ptgGroups->GroupCount;x++) { dwAccountNameSize = 256; dwDomainNameSize = 256;
LookupAccountSid(NULL, ptgGroups->Groups[x].Sid, szAccountName, &dwAccountNameSize,
szDomainName, &dwDomainNameSize, &snuInfo);
if(!strcmp(szAccountName,"Administrators") && !strcmp(szDomainName,"BUILTIN")) return(TRUE); } return(FALSE); } |
|
ein Beispiel aus der Win32 Developers References zu erreichen über Delphi->Hilfe->Windows SDK
barfuesser
|
|
Tana´Ri
      
Beiträge: 230
|
Verfasst: Mi 10.09.03 14:48
@lemming: Wie funktioniert das genau ? könntest du mirs erklären plus ein kleines beispiel.
_________________ mfg
Tana´Ri
|
|
lemming
      
Beiträge: 470
Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
|
Verfasst: Do 11.09.03 10:27
Diese Monster Prozedur gibt dir das Ergebnis von Konsolenprogramme wieder.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| procedure CaptureDosCmd(command:String;OutputMemo:TMemo); . . . procedure TMain.CaptureDosCmd(command:String;OutputMemo:TMemo); const CaptureBufferSize = 2500; var SecAttrib : TSecurityAttributes; ReadPipe,writePipe : THandle; Startup : TStartUpInfo; ProcessInfo : TProcessInformation; CaptureBuffer : Pchar; BytesRead : DWord; WaitHandle : DWord;
begin OutPutMemo.Lines.clear; With SecAttrib do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then begin CaptureBuffer := AllocMem(CaptureBufferSize + 1); FillChar(Startup,Sizeof(Startup),#0); Startup.cb := SizeOf(Startup); Startup.hStdOutput := writePipe; Startup.hStdInput := ReadPipe; Startup.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; Startup.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(command), @SecAttrib, @SecAttrib, true, NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then begin repeat WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100); Application.ProcessMessages; until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;
if not application.terminated then Repeat BytesRead := 0; ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil); CaptureBuffer[BytesRead]:= #0; OemToAnsi(CaptureBuffer,CaptureBuffer); OutputMemo.Text := OutputMemo.Text+String(CaptureBuffer); until (BytesRead < CaptureBufferSize); end else OutPutMemo.lines.add('Operation wurde abgebrochen!'); FreeMem(CaptureBuffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(writePipe); end else OutPutMemo.lines.add('Konnte Kommando nicht starten, Fehler: #'+ inttostr(getlasterror)); end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| CaptureDosCmd('net group GG-Programmierung /domain', MemoOutput); if Pos(Username + ' ', MemoOutput.Text) then begin . . . end; |
-lemming
|
|
|