Announcement

Collapse
No announcement yet.

GetUserName

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetUserName


  • #2
    GetUserName

    Hallo,

    wie genau muss die Deklaration und der Aufruf des API-Calls GetUserName sein. Ich hab schon verschiedenes probiert aber immer den Fehler 1245 zurückbekommen obwohl ich am Netz angemeldet bin

    Gruß

    Andreas Beckhaus

    Comment


    • #3
      Ich benutze folgende Hilsfunktion, um nicht jedesmal mit einem PChar mich herumärgern zu müssen:

      <pre>
      function GetUserNameStr: String;
      var
      pcUserName : Array[0..255] of char;
      iLengthUserName : Cardinal;
      begin
      iLengthUserName := High(pcUserName);
      GetUserName(pcUserName, iLengthUserName);
      result := StrPas(pcUserName);
      end;
      </pre&gt

      Comment


      • #4
        Hallo,

        über die Delphi-Funktion <b>SysErrorMessage</b> kann man sich den Text zur Win32-Fehlernummer anzeigen lassen:
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        begin
        ShowMessage(SysErrorMessage(1245));
        end;
        </pre>
        Wenn man als Benutzer tatsächlich im Netzwerk angemeldet ist, reichen wohl die Benutzerrechte (Privilegien) nicht aus. Ich würde daher den Test zuerst mit Administratorrechten wiederholen

        Comment


        • #5
          Hallo,<p>

          ich verwende in einer Anwendung (Delphi 4) die Funktion <b>GetUserName</b> (Verwendung von PChar). Irgendwann<br>
          (noch während der Entwicklungsphase) lieferte die Funktion nur noch unbrauchbare Zeichen. In anderen Projekten klappt's<br>
          aber noch. Ich habe bereits die Projektoptionen verglichen bzw. gleichgestellt. Zuletzt versuchte ich das Ganze mit <br>
          <b>GetUserNameA</b> (Verwendung von PAnsiChar), mit Erfolg. <p>
          Kann sich jemand denken, warum die Funktion <b>GetUserName</b> in dem einen Projekt nicht mehr funktioniert

          Comment


          • #6
            Hallo,

            wenn man sich die Delphi-Unit <b>Windows.pas</b> näher anschaut, finden sich dort die 3 folgenden Zeilen:
            <pre>
            function GetUserNameA; external advapi32 name 'GetUserNameA';
            function GetUserNameW; external advapi32 name 'GetUserNameW';
            function GetUserName; external advapi32 name 'GetUserNameA';
            </pre>
            Somit "biegt" Delphi jeden Aufruf von GetUserName automatisch auf die Win32-API-Funktion GetUserNameA (für ANSI-Zeichen) um. Die UNICODE-Version GetUserNameW ist nur unter Windows NT/2000 verwendbar und wird daher von Delphi ignoriert, damit die Anwendung auch unter Windows 9x/Me läuft.

            Der Fehler muss sich also irgendwo anders eingeschlichen werden. Wie sieht die Deklaration und Vorbereitung der Puffer-Variable aus, in die Win32 den Benutzernamen kopiert? Der folgende Weg sollte in jedem Fall funktionieren:
            <pre>
            procedure TForm1.Button1Click(Sender: TObject);
            var
            szUserName : array[0..99] of Char;
            dwSize : DWORD;
            begin
            FillChar(szUserName, SizeOf(szUserName), 0);
            dwSize := SizeOf(szUserName);
            GetUserName(szUserName, dwSize);
            ShowMessage(szUserName);
            end;
            </pre&gt

            Comment


            • #7
              Hallo Herr Kosch,<P>

              mit obigem Aufruf hat es funktioniert. Was ist denn an meinem ursprünglichen Aufruf falsch (diese Funktion gibt in anderen<br>
              Anwendungen noch das richtige Ergebnis zurück)???<p>
              <pre>
              <b>FUNCTION</b> Get_UserName: string;
              s: string[200];
              i: cardinal;
              begin
              try
              GetUserName(@s[1], i);
              s[0]:= char(i);
              result:= s;
              except
              result:= ''
              end
              end;
              </pre&gt

              Comment


              • #8
                Hallo,

                Windows arbeitet mit den sogenannten <i>nullterminierten Strings</i>, d.h. die Stringlänge ergibt sich durch die erste (!) Fundstelle eines NULL-Zeichens (#0). In meinem Beispiel habe ich <b>FillChar</b> aufgerufen, um die Puffervariable vollständig mit NULL-Zeichen zu füllen. Wenn Windows nun zum Beispiel den Benutzernamen "Test" hineinkopiert, so ergibt sich das folgende Bild: <i>Test#0#0#0#0#0...</i>. Das Stringende (erste Position von #0) wird garantiert gefunden.

                Wenn allerdings die Puffervariable als <i>String[200]</i> deklariert wird, handelt es sich <b>nicht</b> um einen ANSI-String, sondern um einen Pascal-String, bei dem die Länge im ersten Byte abgelegt wird - allerdings kennt Win32 keine Pascal-Strings, so dass Win32 darauf keine Rücksicht nimmt. Das Ergebnis hängt nun davon ab, welche <b>zufälligen</b> Zeichen sich beim Aufruf an dieser Speicherstelle der Puffervariable befinden.

                In meinem Buch <i>Delphi Win32-Lösungen</i> befasst sich das komplette Kapitel 3 auf den Seiten 87 bis 113 mit diesem Thema.
                &#10

                Comment


                • #9
                  Hallo Claudia,

                  bei mir ist das Problem heute auch aufgetreten. Bei meinem Programm lag es daran, dass ich die zweite Übergabe zwar deklariert, aber noch keinen Wert zugewiesen hatte. Mit nSize:=SizeOf(pBuffer) lief das ganze dann auch so wieder

                  Comment


                  • #10
                    Richtig, im Source von Claudia ist bei getUserName(@S[1], <b>I</b>) vorher NICHT initialisiert wurden. Dieser Parameter dient dieser API Funktion aber zu EIN- und AUS-gabe. Ein I := 200; vorher sollte das problem beseitigen.

                    Gruß Hage

                    Comment

                    Working...
                    X