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

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

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/library/default.asp?url=/library/en-us/netmgmt/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ć.

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;
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

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)

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