Announcement

Collapse
No announcement yet.

Arbeitsgruppe auslesen unter NT und 2000

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

  • Arbeitsgruppe auslesen unter NT und 2000

    Hallo zusammen,

    ich hab ein Problem, und zwar möchte ich die Arbeitsgruppe, in der mein Rechner ist auslesen. Unter Win 98 steht die Arbeitsgruppe in der Registry jedoch habe ich unter NT bzw 2000 noch keinen eindeutigen Schlüssel gefunden. Gibt es noch eine andere Möglichkeit die Arbeitsgruppe auszulesen?
    Bin für jeden Tipp dankbar.

    Gruß Phillip

  • #2
    Hallo Jan-Phillip,<br>
    <br>
    schau Dir mal die Funktion <b>NetWkstaGetInfo</b> an. Die sollte Dir genau das gewünschte ermöglichen.<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      hallo Christian,

      ich hab in der Hilfe schon nachgeschaut und es sieht wirklich so aus als sei es genau das, was ich suche. Jetzt habe ich nur ein weiteres Problem, und zwar habe ich keine Ahnung, wie ich diese fuktion in delphi einbaue. Ist das eine DLL? Kannst du mir bitte noch mal helfen?

      Gruß Philli

      Comment


      • #4
        Hallo Phillip,<br>
        <br>
        da Delphi leider wohl nicht über Definitionen für die LanManager Funktionen verfügt (jedenfalls bei D5),<br>
        hier mal die erforderlichen Deklarationen und ein kleines Beispiel:<br>
        <br>
        <pre>
        const // Aus LMErr.H
        NERR_SUCCESS = 0;

        type // Aus LMCons.H
        NET_API_STATUS = DWord;

        PWKSTA_INFO_100 = ^WKSTA_INFO_100;
        PWKSTA_INFO_101 = ^WKSTA_INFO_101;
        PWKSTA_INFO_102 = ^WKSTA_INFO_102;

        WKSTA_INFO_100 =
        packed record
        wki100_platform_id : DWord;
        wki100_computername : PWChar;
        wki100_langroup : PWChar;
        wki100_ver_major : DWord;
        wki100_ver_minor : DWord;
        end;

        WKSTA_INFO_101 =
        packed record
        wki101_platform_id : DWord;
        wki101_computername : PWChar;
        wki101_langroup : PWChar;
        wki101_ver_major : DWord;
        wki101_ver_minor : DWord;
        wki101_lanroot : PWChar;
        end;

        WKSTA_INFO_102 =
        packed record
        wki102_platform_id : DWord;
        wki102_computername : PWChar;
        wki102_langroup : PWChar;
        wki102_ver_major : DWord;
        wki102_ver_minor : DWord;
        wki102_lanroot : PWChar;
        wki102_logged_on_users : DWord;
        end;

        function // Aus LMWksta.h
        NetWkstaGetInfo(
        const servername : PWChar;
        const level : DWord;
        const bufptr : Pointer
        ) : NET_API_STATUS; stdcall; external 'NETAPI32.DLL' name 'NetWkstaGetInfo';

        function // Aus LMAPIBuf.h
        NetApiBufferFree(
        const bufptr : Pointer
        ) : NET_API_STATUS; stdcall; external 'NETAPI32.DLL' name 'NetApiBufferFree';

        BEISPIEL:
        var
        pBuffer : Pointer;

        begin
        try
        if NetWkstaGetInfo(nil,100,@pBuffer) = NERR_SUCCESS then
        begin
        ShowMessage(PWKSTA_INFO_100(pBuffer)^.wki100_langr oup);
        end;
        finally
        NetApiBufferFree(pBuffer);
        end;
        end;
        </pre>
        <br>
        Da die Funktionen den Speicher für den Buffer selber reservieren, MUSS dieser anschliessend mit NetApiBufferFree wieder freigegeben werden.<br>
        Das Beispiel ist getestet und funzt.<br>
        Diese Funktionen stehen NUR unter NT (ab 3.1) zur Verfügung. NICHT unter 9x/me.<br>
        <br>
        Ciao<br>
        Chri

        Comment


        • #5
          Hallo Chris,

          danke funktioniert wirklich, nur habe ich jetzt festgestellt, dass das Programm gar nicht mehr unter Win 9x funktioniert, weil man ja auf eine DLL verweist die es unter 9x nicht gibt. Gibt es vielleicht eine DLL die in jedem Microsoft OS vorhanden ist, mit der man arbeiten kann? Falls nicht bin ich dir trotzdem dankbar. Hab eine Menge gelernt.

          Gruß Philli

          Comment


          • #6
            Hallo Phillip,<br>
            <br>
            als Schnelllösung fällt mir da nur ein Beide Varianten zu kombinieren, sprich:<br>
            Unter 9x aus der Registry auslesen, unter NT die Funktion benutzen, also vor dem Auslesen der Informationen, das BS abfragen.<br>
            Ich fürchte mal, dass es keine Funktion gibt, die das Gewünschte auf beiden BS-Schienen ausführt.<br>
            Eine Funktion, die das Auslesen aus der Registry ersetzt kenne ich leider auch nicht.<br>
            Da 9x wohl auch nicht weitergeführt wird, und XP zu NT zu rechnen ist, besteht wohl auch keine Gefahr, dass das Registryauslesen in späteren Versionen nicht mehr funktioniert, da es die wohl nicht geben wird.<br>
            <br>
            Ciao<br>
            Chri

            Comment


            • #7
              Hi Christian,

              ich bin inzwischen ein ganzes Stück weiter. Ich habe vor die DLL dynamisch zur Laufzeit zu laden dadurch bekomme ich nicht das Problem, dass das Programm nicht unter Win 9x läuft. Trotzdem ist jetzt noch irgendetwas falsch und ich weiß nicht was. Kannst du mir bitte noch mal helfen?

              hier mein Quellcode:

              {***--- Deklaration zum auslesen der Arbeitsgruppe unter NT und 2000 ---***}
              const // Aus LMErr.H
              NERR_SUCCESS = 0;

              type // Aus LMCons.H
              NET_API_STATUS = DWord;
              PWKSTA_INFO_100 = ^WKSTA_INFO_100;
              PWKSTA_INFO_101 = ^WKSTA_INFO_101;
              PWKSTA_INFO_102 = ^WKSTA_INFO_102;
              WKSTA_INFO_100 =
              packed record
              wki100_platform_id : DWord;
              wki100_computername : PWChar;
              wki100_langroup : PWChar;
              wki100_ver_major : DWord;
              wki100_ver_minor : DWord;
              end;
              WKSTA_INFO_101 =
              packed record
              wki101_platform_id : DWord;
              wki101_computername : PWChar;
              wki101_langroup : PWChar;
              wki101_ver_major : DWord;
              wki101_ver_minor : DWord;
              wki101_lanroot : PWChar;
              end;
              WKSTA_INFO_102 =
              packed record
              wki102_platform_id : DWord;
              wki102_computername : PWChar;
              wki102_langroup : PWChar;
              wki102_ver_major : DWord;
              wki102_ver_minor : DWord;
              wki102_lanroot : PWChar;
              wki102_logged_on_users : DWord;
              end;

              type TNETSTATFUNCTION = function
              (
              const servername : PWChar;
              const level : DWord;
              const bufptr : Pointer
              ) : NET_API_STATUS;

              type TNetApiBufferFreeFunction = function(bufptr : Pointer): NET_API_STATUS;
              {***--------------- Deklarationsende ---------------------***}

              procedure GetWorkgroup;
              var pBuffer : Pointer;
              Handle : THandle;
              NetStatFunction : TNetStatFunction;
              begin
              try
              pbuffer := nil;
              Handle:=LoadLibrary(PChar('netapi32.dll'));
              if Handle <> 0 then
              begin
              Main.RichEdit1.Lines.Add('NetAPI32.Dll wurde geladen.');
              @NetStatFunction := GetProcAddress(Handle, 'NetWkstaGetInfo');
              if NetStatFunction(nil,100,@pBuffer) = NERR_SUCCESS then
              begin
              //NetStatFunction(nil,100,pBuffer);
              ShowMessage(PWKSTA_INFO_100(pBuffer)^.wki100_langr oup);
              Main.RichEdit1.Lines.Add('Die Arbeitsgruppe ist: ' + PWKSTA_INFO_100(pBuffer)^.wki100_langroup);
              end;
              if @NETSTATFunction = nil then
              begin
              Main.RichEdit1.Lines.Add('Arbeitsgruppe auslesen geht nicht.');
              end;
              end;
              if Handle = 0 then
              begin
              Main.RichEdit1.Lines.Add('NetApi32.Dll wurde nicht geladen.');
              end;
              finally
              Main.RichEdit1.Lines.Add('Speicher wird wieder freigegeben.');
              //BufferFree(pBuffer);
              end;
              end

              Comment


              • #8
                Hi Christian,

                ich bin inzwischen ein ganzes Stück weiter. Ich habe vor die DLL dynamisch zur Laufzeit zu laden. Dadurch bekomme ich nicht das Problem, dass das Programm nicht unter Win 9x läuft. Trotzdem habe ich noch ein Problem und zwar funktioniert das ganze noch nicht und ich hab keine Ahnung woran das liegt. Kannst du mir bitte noch mal helfen?

                Hier mein Quellcode:

                {***--- Deklaration für das Auslesen der Arbeitsgruppe unter NT und 2000 ---***}
                const // Aus LMErr.H
                NERR_SUCCESS = 0;

                type // Aus LMCons.H
                NET_API_STATUS = DWord;
                PWKSTA_INFO_100 = ^WKSTA_INFO_100;
                PWKSTA_INFO_101 = ^WKSTA_INFO_101;
                PWKSTA_INFO_102 = ^WKSTA_INFO_102;
                WKSTA_INFO_100 =
                packed record
                wki100_platform_id : DWord;
                wki100_computername : PWChar;
                wki100_langroup : PWChar;
                wki100_ver_major : DWord;
                wki100_ver_minor : DWord;
                end;
                WKSTA_INFO_101 =
                packed record
                wki101_platform_id : DWord;
                wki101_computername : PWChar;
                wki101_langroup : PWChar;
                wki101_ver_major : DWord;
                wki101_ver_minor : DWord;
                wki101_lanroot : PWChar;
                end;
                WKSTA_INFO_102 =
                packed record
                wki102_platform_id : DWord;
                wki102_computername : PWChar;
                wki102_langroup : PWChar;
                wki102_ver_major : DWord;
                wki102_ver_minor : DWord;
                wki102_lanroot : PWChar;
                wki102_logged_on_users : DWord;
                end;

                type TNETSTATFUNCTION = function
                (
                const servername : PWChar;
                const level : DWord;
                const bufptr : Pointer
                ) : NET_API_STATUS;

                type TNetApiBufferFreeFunction = function(bufptr : Pointer): NET_API_STATUS;

                {***--------------- Deklarationsende ---------------------***}

                var
                Main: TMain;

                implementation

                {$R *.DFM}

                procedure BufferFree(const bufptr : Pointer);
                var Handle : THandle;
                NetApiBufferFreeFunction : TNetApiBufferFreeFunction;
                begin
                try
                Handle:=LoadLibrary(PChar('netapi32.dll'));
                if Handle <> 0 then
                begin
                NetApiBufferFreeFunction := GetProcAddress(Handle, 'NetApiBufferFree');
                if @NetApiBufferFreeFunction <> nil then
                begin
                NetApiBufferFreeFunction(bufptr);
                end;
                end;
                finally
                end;
                end;

                procedure GetWorkgroup;
                var pBuffer : Pointer;
                Handle : THandle;
                NetStatFunction : TNetStatFunction;
                begin
                try
                pbuffer := nil;
                Handle:=LoadLibrary(PChar('netapi32.dll'));
                if Handle <> 0 then
                begin
                Main.RichEdit1.Lines.Add('NetAPI32.Dll wurde geladen.');
                @NETSTATFunction := GetProcAddress(Handle, 'NetWkstaGetInfo');
                if NETSTATFunction(nil,100,@pBuffer) = NERR_SUCCESS then
                begin
                ShowMessage(PWKSTA_INFO_100(pBuffer)^.wki100_langr oup);
                end;
                end;
                if Handle = 0 then
                begin
                Main.RichEdit1.Lines.Add('NetApi32.Dll wurde nicht geladen.');
                end;
                finally
                Main.RichEdit1.Lines.Add('Speicher wird wieder freigegeben.');
                BufferFree(pBuffer);
                end;
                end

                Comment


                • #9
                  Hi Christian,

                  ich bin inzwischen ein ganzes Stück weiter. Ich habe vor die DLL dynamisch zur Laufzeit zu laden. Dadurch bekomme ich nicht das Problem, dass das Programm nicht unter Win 9x läuft. Trotzdem habe ich noch ein Problem und zwar funktioniert das ganze noch nicht und ich hab keine Ahnung woran das liegt. Kannst du mir bitte noch mal helfen?

                  Hier mein Quellcode:

                  {***--- Deklaration für das Auslesen der Arbeitsgruppe unter NT und 2000 ---***}
                  const // Aus LMErr.H
                  NERR_SUCCESS = 0;

                  type // Aus LMCons.H
                  NET_API_STATUS = DWord;
                  PWKSTA_INFO_100 = ^WKSTA_INFO_100;
                  PWKSTA_INFO_101 = ^WKSTA_INFO_101;
                  PWKSTA_INFO_102 = ^WKSTA_INFO_102;
                  WKSTA_INFO_100 =
                  packed record
                  wki100_platform_id : DWord;
                  wki100_computername : PWChar;
                  wki100_langroup : PWChar;
                  wki100_ver_major : DWord;
                  wki100_ver_minor : DWord;
                  end;
                  WKSTA_INFO_101 =
                  packed record
                  wki101_platform_id : DWord;
                  wki101_computername : PWChar;
                  wki101_langroup : PWChar;
                  wki101_ver_major : DWord;
                  wki101_ver_minor : DWord;
                  wki101_lanroot : PWChar;
                  end;
                  WKSTA_INFO_102 =
                  packed record
                  wki102_platform_id : DWord;
                  wki102_computername : PWChar;
                  wki102_langroup : PWChar;
                  wki102_ver_major : DWord;
                  wki102_ver_minor : DWord;
                  wki102_lanroot : PWChar;
                  wki102_logged_on_users : DWord;
                  end;

                  type TNETSTATFUNCTION = function
                  (
                  const servername : PWChar;
                  const level : DWord;
                  const bufptr : Pointer
                  ) : NET_API_STATUS;

                  type TNetApiBufferFreeFunction = function(bufptr : Pointer): NET_API_STATUS;

                  {***--------------- Deklarationsende ---------------------***}

                  var
                  Main: TMain;

                  implementation

                  {$R *.DFM}

                  procedure BufferFree(const bufptr : Pointer);
                  var Handle : THandle;
                  NetApiBufferFreeFunction : TNetApiBufferFreeFunction;
                  begin
                  try
                  Handle:=LoadLibrary(PChar('netapi32.dll'));
                  if Handle <> 0 then
                  begin
                  NetApiBufferFreeFunction := GetProcAddress(Handle, 'NetApiBufferFree');
                  if @NetApiBufferFreeFunction <> nil then
                  begin
                  NetApiBufferFreeFunction(bufptr);
                  end;
                  end;
                  finally
                  end;
                  end;

                  procedure GetWorkgroup;
                  var pBuffer : Pointer;
                  Handle : THandle;
                  NetStatFunction : TNetStatFunction;
                  begin
                  try
                  pbuffer := nil;
                  Handle:=LoadLibrary(PChar('netapi32.dll'));
                  if Handle <> 0 then
                  begin
                  Main.RichEdit1.Lines.Add('NetAPI32.Dll wurde geladen.');
                  @NETSTATFunction := GetProcAddress(Handle, 'NetWkstaGetInfo');
                  if NETSTATFunction(nil,100,@pBuffer) = NERR_SUCCESS then
                  begin
                  ShowMessage(PWKSTA_INFO_100(pBuffer)^.wki100_langr oup);
                  end;
                  end;
                  if Handle = 0 then
                  begin
                  Main.RichEdit1.Lines.Add('NetApi32.Dll wurde nicht geladen.');
                  end;
                  finally
                  Main.RichEdit1.Lines.Add('Speicher wird wieder freigegeben.');
                  BufferFree(pBuffer);
                  end;
                  end

                  Comment


                  • #10
                    Hallo Phillip,<br>
                    <br>
                    Bei den Deklarationen für die Funktionen fehlt am Ende noch ein <b>stdcall</b> also:<br>
                    type TNETSTATFUNCTION = function ( const servername : PWChar; const level : DWord; const bufptr : Pointer ) : NET_API_STATUS; <br>stdcall</b>;<br>
                    type TNetApiBufferFreeFunction = function(bufptr : Pointer): NET_API_STATUS; <b>stdcall</b>;<br>
                    Dieser ist bei API Funktionen unerlässlich, damit die Paramterübergabe korrekt funktioniert (gilt übrigens auch für selbst zu definierende Callback Funktionen, wie z.B. bei EnumWindows)<br>
                    <br>
                    Ciao<br>
                    Chri

                    Comment


                    • #11
                      Hi Christian,

                      <B>es funktioniert !!!<B>
                      ich bin dir wirklich dankbar. Außerdem hab ich zusätzlich noch recht viel gelernt, z.B. wie man DLL's zur Laufzeit und zur Ladezeit einbindet.

                      Nochmals vielen Dank.

                      Gruß Philli

                      Comment


                      • #12
                        Hallo Phillip,<br>
                        <br>
                        peinlich, peinlich <br>
                        Schau doch noch mal hier:<br>
                        http://www.entwickler-forum.de\webx?50@@.ee88e67<br>
                        <br>
                        Ciao<br>
                        Chri

                        Comment

                        Working...
                        X