Конференция "Сети" » Вывести информацию о пользователях, подключенных к рабочей станци [D7, WinXP]
 
  • Старый (03.03.10 21:56) [0]
    Этот пример выдаёт ошибку при возврате Result := THostInfo(info^);

    type
      THostInfo = record
        username: PWideChar;
        logon_domain: PWideChar;
        other_domains: PWideChar;
        logon_server: PWideChar;
      end;

      WKSTA_USER_INFO_0 = packed record
        wkui0_username: PWideChar;
      end;
      PWKSTA_USER_INFO_0 = ^WKSTA_USER_INFO_0;

    implementation

    {$R *.dfm}

    function NetWkstaUserEnum(servername: PWideChar;
      // Pointer to a string that specifies the DNS or NetBIOS name of the
     // remote server on which the function is to execute.
     // If this parameter is nil, the local computer is used.
     level: DWORD;
      // Level = 0 : Return the names of users currently logged on to the workstation.
     var bufptr: Pointer;   // Pointer to the buffer that receives the data
     prefmaxlen: DWORD;
      // Specifies the preferred maximum length of returned data, in bytes.
     var entriesread: PDWord;
      // Pointer to a value that receives the count of elements actually enumerated.
     var totalentries: PDWord;  // total number of entries
     var resumehandle: PDWord)
      // contains a resume handle which is used to continue an existing search
     : Longint;
      stdcall; external 'netapi32.dll' Name 'NetWkstaUserEnum';

    function EnumNetUsers(HostName: WideString {; Users: TStrings}): THostInfo;
    const
      STR_ERROR_ACCESS_DENIED = 'The user does not have access to the requested information.';
      STR_ERROR_MORE_DATA = 'Specify a large enough buffer to receive all entries.';
      STR_ERROR_INVALID_LEVEL = 'The level parameter is invalid.';
    var
      Info: Pointer;
      ElTotal: PDWord;
      ElCount: PDWord;
      Resume: PDWord;
      Error: Longint;
      // UI : PWKSTA_USER_INFO_0;
     // i : Integer;
    begin
      Resume := 0;
      NetWkstaUserEnum(PWideChar(HostName),
        1,
        Info,
        0,
        ElCount,
        ElTotal,
        Resume);

      Error := NetWkstaUserEnum(PWideChar(HostName),
        1,
        Info,
        256 * Integer(ElTotal),
        ElCount,
        ElTotal,
        Resume);

      case Error of
        ERROR_ACCESS_DENIED: Result.UserName := STR_ERROR_ACCESS_DENIED;
        ERROR_MORE_DATA: Result.UserName     := STR_ERROR_MORE_DATA;
        ERROR_INVALID_LEVEL: Result.UserName := STR_ERROR_INVALID_LEVEL
          else
            if Info <> nil then
            begin
              Result := THostInfo(info^);
        {
       To retrieve all users:
       UI := PWKSTA_USER_INFO_0(Info);
       for i := 1 to DWord(ElCount) do
       begin
         Users.Add(UI^.wkui0_username);
         inc(UI);
       end;
       }

            end
            else
              begin
                Result.UserName      := 'N/A';
                Result.logon_domain  := 'N/A';
                Result.other_domains := 'N/A';
                Result.logon_server  := 'N/A';
              end;
      end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      HostInfo: THostInfo;
    begin
      // Specify target machine as argument (with or without preceding \\)
     HostInfo := EnumNetUsers('WORKSTATION');
      with HostInfo do
      begin
        Memo1.Lines.Add(username + #13#10+
         logon_domain + #13#10+
         other_domains + #13#10+
         logon_server);
      end;
    end;

  • Старый (03.03.10 21:58) [1]
    Надо позарез, надоели юзвери!!!
  • _userman_ (03.03.10 22:35) [2]
    Не забыли ли Вы под указатель на структуру Info память выделить?
  • Eraser © (04.03.10 02:12) [3]
    > [1] Старый   (03.03.10 21:58)

    так полно готовых решений )
  • Nik RON (27.12.12 15:43) [4]
    >>>HostInfo := EnumNetUsers('WORKSTATION');
    а надо HostInfo := EnumNetUsers('LOCALHOST');
 
Конференция "Сети" » Вывести информацию о пользователях, подключенных к рабочей станци [D7, WinXP]
Есть новые Нет новых   [118679   +72][b:0][p:0.003]