Jak pobrać ilość użytkowników Windows XP?

Odpowiedz Nowy wątek
2006-08-13 12:34
Piotrek_s
0

Witam wszystkich

Mam dwa pytanie:

  1. W jaki sposób można pobrać ilość uzytkowników aktualnie zalogowanych do systemu Windows XP(uzytkownikcy korzystają z funkcji "szybkiego przełączania użytkowników")?
  2. Czy istnieje wpis w rejestrze który pozwoli zablokować użytkownikowi mozliwość zmiany strefy czasowej (użytkownik ma prawa administratora)?

z góry dziękuje za jakąkolwiek podpowiedź,

Pozdrawiam

Pozostało 580 znaków

2006-08-13 20:18
ŁF
0

ad1. nie widzę żadnej bezpośredniej metody - oto jedyne co wykombinowałem:
funkcją NetUserEnum jedziesz w pętli po wszystkich użytkownikach, przy czym wywołujesz funkcję z level=23, więc zwróci Ci czas ostatniego logowania i wylogowania usera. jeśli czas logowania > czas wylogowania, to user musi być zalogowany.

polecam lekturę http://msdn.microsoft.com/lib[...]tmgmt/netmgmt/netuserenum.asp oraz przejrzenie wszystkich funkcji z biblioteki Netapi32, moze coś znajdzie się coś bardziej sensownego.

ad2. jeśli użytkownik jest administratorem, to co nawyżej możesz mu utrudnić to zadanie, ale nie możesz go zablokować.


Pozostało 580 znaków

2006-08-13 22:12
Opi
0

Zalogowanych użytkowników, wystarczy pobrać na podstawie uruchomionych procesów:

function GetLogonUsers(Lista: TStrings): Boolean;
type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;
var
  cbBuf: Cardinal;
  snu: SID_NAME_USE;
  ptiUser: PTOKEN_USER;
  hToken, hProcSnap, ProcessHandle: THandle;
  pe32: TProcessEntry32;
  bSuccess: Boolean;
  UserSize, DomainSize: DWORD;
  Domain, User: string;
begin
 hProcSnap   := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
 pe32.dwSize := SizeOf(ProcessEntry32);
 
 if Process32First(hProcSnap, pe32) = True then
   while Process32Next(hProcSnap, pe32) = True do
     begin
      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, pe32.th32ProcessID);
 
      if ProcessHandle <> 0 then
        begin
         // EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
         if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
           begin
            bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
            ptiUser  := nil;
 
            while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
              begin
               ReallocMem(ptiUser, cbBuf);
               bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
              end;
 
            CloseHandle(hToken);
            UserSize   := 0;
            DomainSize := 0;
            LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
 
            if (UserSize <> 0) and (DomainSize <> 0) then
              begin
               SetLength(User, UserSize);
               SetLength(Domain, DomainSize);
 
               if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize, PChar(Domain), DomainSize, snu) then
                 begin
                  if (UpperCase(StrPas(PChar(User))) <> 'SYSTEM') and (not Lista.IndexOf(StrPas(PChar(User))) > -1) then Lista.Add(StrPas(PChar(User)));
                //  if not Lista.IndexOf(StrPas(PChar(Domain))) > -1 then Lista.Add(StrPas(PChar(Domain)));
                 end;
              end;
 
            if bSuccess then FreeMem(ptiUser);
           end;
 
         CloseHandle(ProcessHandle);
        end;
    end;
 
 CloseHandle(hProcSnap);
 if Lista.Count > 0 then Result := True
 else Result := False;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 GetLogonUsers(ListBox1.Items);
end;

Pozostało 580 znaków

2008-01-31 14:00
0

witam.. wiem że temat jest trochę stary... ale właśnie czegoś takiego szukam.. w necie nie mogę niczego podobnego znaleźć więc postanowiłem odświeżyć temat ;-) he..

więc używał ktoś z Was tego kodu z poprzedniego postu?? kiedy odpalam to oczywiście wszystko działa ale jako odpowiedź dostaję tylko nazwę jednego użytkownika, tego który właśnie jest zalogowany.. a potrzebuję wszystkich którzy są w danej chwili zalogowani (poprzełączani poprzez windowsowski "przełącz użytkownika)
oczywiście zalogowałem się na 2 konta i przełączałem się..

jak by ktoś wiedział dlaczego tak się może dziać to będę bardzo wdzięczny za odpowiedź..

z góry dzięki i pozdrawiam

Pozostało 580 znaków

2008-01-31 22:44
0

wydaje mi sie ze windows nie pozwala na to zebys widzial procesy innych userow. Rozwiazeniem moglby byc jakis serwis ktory chodzi w tle i loguje do pliku nazwe usera a przy zamykaniu czysci ten wpis (plik jest dostepnny w ramach wszystkich sesji)


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0