Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Netzwerkkennwort dialog anzeigen (https://www.delphipraxis.net/25372-netzwerkkennwort-dialog-anzeigen.html)

SleepyMaster 5. Jul 2004 16:00


Netzwerkkennwort dialog anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi ihrs!

Weiß jemand wie man den Netzwerkkennwort dialog (siehe Anhang) anzeigen kann?

Vielen Dank schon mal!

Stevie 6. Jul 2004 10:21

Re: Netzwerkkennwort dialog anzeigen
 
Das wird schwierig. Ich hab mir das Ding mal mit Microsoft Spy++ und WinSight32 angeguckt, aber keine Info über das Ding bekommen. Wenn man wüsste, in welcher dll das steckt...

Christian Seehase 6. Jul 2004 10:34

Re: Netzwerkkennwort dialog anzeigen
 
Moin SleepyMaster,

grundsätzlich könntest Du dafür doch selber einen Dialog mit zwei Eingabefeldern erstellen.

SleepyMaster 6. Jul 2004 11:03

Re: Netzwerkkennwort dialog anzeigen
 
@Christian: Ja, eigendlich schon. Aber ich finde es eigendlich schon besser, wnn da wo man die Windows Standart Dialoge verwenden kann, man sie auch verwendet, und nicht das selbe nochmal programmiert.

@Stevie: Wo bekommt man WinSight32 her?

@All: Weiß jemand ne Lösung??? :lol:

Stevie 6. Jul 2004 11:06

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von SleepyMaster
@Stevie: Wo bekommt man WinSight32 her?

WS32.EXE im Delphi\Bin-Verzeichnis... (Delphi6 Pro)

shmia 6. Jul 2004 11:07

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von SleepyMaster
@All: Weiß jemand ne Lösung??? :lol:

Beschaffe dir mal Infos über die Funktion WNetConnectionDialog1.
Könnte evtl. das sein, was du brauchst. :wink:

SleepyMaster 6. Jul 2004 11:51

Re: Netzwerkkennwort dialog anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Stevie: Danke

@shmia: Leider kann man damit nur den "Netzlaufwerk verbinden" dialog erstellen (siehe Anhang)

Falls jemand den Code braucht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  CDS: TConnectDlgStruct;
begin
CDS.cbStructure := sizeof(TConnectDlgStruct);
CDS.hwndOwner := Handle;
CDS.lpConnRes := AllocMem(sizeof(TNetResourceA));
CDS.lpConnRes^.dwType := RESOURCETYPE_DISK;
CDS.dwFlags := 0;
WNetConnectionDialog1(CDS);
FreeMem(CDS.lpConnRes);
end;
@All: Kennt jemand nen anderen Lösungsansatz? :lol:

[EDIT]Speicher wieder freigegeben[/EDIT]

toms 6. Jul 2004 12:03

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

AllocMem(sizeof(TNetResourceA));
Musst du dann nicht wieder den allozierten Speicher freigeben?

SleepyMaster 6. Jul 2004 12:10

Re: Netzwerkkennwort dialog anzeigen
 
Doch! Stimmt!

SleepyMaster 8. Jul 2004 09:20

Re: Netzwerkkennwort dialog anzeigen
 
[PUSH]Weiß jemand wie man den Netzwerkkennwort dialog anzeigen kann?[/PUSH]

Shir Khan 8. Jul 2004 13:34

Re: Netzwerkkennwort dialog anzeigen
 
*prust*

Ich hab mit diesem Dialog schon mal gearbeitet. Ist allerdings schon etwas her, daher kann ich eigentlich nur sagen wie man in Win9x/ME diesen Dialog hervorzaubern kann. Ich denke in XP wird es genau so gehen, müsste ich aber erst testen.

Die Dialogbox versteckt sich in der mpr.dll und wird über deren Funktion "PwdChangePassword" aktiviert.
Code:
HINSTANCE hmpr=::LoadLibrary("MPR.DLL");
typedef VOID (WINAPI *PWDCHANGEPASSWORD)(LPCSTR lpcRegkeyname,HWND hwnd,UINT uiReserved1,UINT uiReserved2);
PWDCHANGEPASSWORD PwdChangePassword=(PWDCHANGEPASSWORD)::GetProcAddress(hmpr,"PwdChangePasswordA");
GVT

SleepyMaster 8. Jul 2004 20:43

Re: Netzwerkkennwort dialog anzeigen
 
Hi Shir Khan!

Leider hab ich es nicht geschafft deinen Code von ???was?ist?das?eigentlich??? nach !!!DELPHI!!! zu übersetzen:

Delphi-Quellcode:
type
  TPwdChangePassword = procedure(lpcRegkeyname: LPCSTR; hwnd:HWND; uiReserved1, uiReserved2: UINT);
var
  hDLL: THandle;
  p: pointer;
begin
hDLL:=LoadLibrary('MPR.DLL');
if hDLL <> INVALID_HANDLE_VALUE then
  begin
  p := GetProcAddress(hDLL, 'PwdChangePasswordA');
  if p <> nil then
    begin
    TPwdChangePassword(p)('Hallo' ,Handle,0,0);
    end;
  end;
Die Addresse von PwdChangePasswordA wird erst garnicht gefunden.

Genauso wie in der MSDN nix über PwdChangePasswordA steht.

@All: Gubt es überhaupt eine Lösung dafür???

Luckie 8. Jul 2004 22:00

Re: Netzwerkkennwort dialog anzeigen
 
In der DLL unter 2000 ist auch keine Fuznktion exportiert, die obiger auch nur ähnlich ist.

DaFox 8. Jul 2004 22:01

Re: Netzwerkkennwort dialog anzeigen
 
Hi,

vielleicht zwei Hinweise:
1. stdcall vergessen! ;-)
2. PwdChangePassword() und VerifyScreenSavePwd() sind in der mpr.dll IMHO nur unter Win9x/ME verfügbar.

Gruß,
Markus

SleepyMaster 9. Jul 2004 10:02

Re: Netzwerkkennwort dialog anzeigen
 
OK! Gibt es eine andere Löusng? Oder existiert der Netzwerkkennwort dialog garnicht in einer DLL???

DaFox 10. Jul 2004 03:13

Re: Netzwerkkennwort dialog anzeigen
 
Hi,

Zitat:

Zitat von SleepyMaster
OK! Gibt es eine andere Löusng? Oder existiert der Netzwerkkennwort dialog garnicht in einer DLL???

Hilft das weiter? Habe momentan leider kein XP zur Hand. Getestet unter Windows 2000, SP4.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hInet: hInternet;
  hConn: hInternet;
  hReq: hInternet;
begin
  hInet := InternetOpen('SleepyMaster''s Agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil,0 );
  hConn := InternetConnect(hInet, "'host einfügen'", INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  hReq := HttpOpenRequest(hConn, 'GET', "'pfad einfügen'", 'HTTP/1.0', nil, nil, 0, 0);
  if HttpSendRequest(hReq, nil, 0, nil, 0) then
  begin
    InternetErrorDlg(Handle, hReq, ERROR_INTERNET_INCORRECT_PASSWORD,
                     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, Pointer(nil^));
  end;
  if assigned(hConn) then InternetCloseHandle(hConn);
  if assigned(hReq) then InternetCloseHandle(hReq);
  if assigned(hInet) then InternetCloseHandle(hInet);
end;
Gruß,
Markus

SleepyMaster 10. Jul 2004 15:38

Re: Netzwerkkennwort dialog anzeigen
 
@DaFox: Sorry! Aber was ich suche ist ein dialog der so aussieht: http://www.delphipraxis.net/download.php?id=6198

DaFox 11. Jul 2004 00:10

Re: Netzwerkkennwort dialog anzeigen
 
Okay, sorry. Diesen Dialog gibt es bei Win2000 nicht bzw. er hat eben ein anderes Aussehen aber den selben Zweck und Inhalt. Ich habe gehofft, dass das zu WinXP nicht verändert wurde.
Darf ich fragen welcher Dialog bei Dir angezeigt wird, wenn Du den obigen Code benutzt?

Gruß,
Markus

NicoDE 11. Jul 2004 06:17

Re: Netzwerkkennwort dialog anzeigen
 
Es gibt etliche Versionen des Dialogs. Der Dialog auf dem Screenshot stammt von einem Aufruf von CredUIPromptForCredentials.

NicoDE 11. Jul 2004 11:56

Re: Netzwerkkennwort dialog anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ein Beispielaufruf könnte so aussehen:
Delphi-Quellcode:
uses
  WinCred;

resourcestring
  MessageText = 'Geben Sie Namen und Kennwort eines Kontos mit ' +
                'Berechtigungen für %s ein.'#13#10#13#10 +
                'Beispiel: benutzername oder domäne\benutzername';
  CaptionText = 'Netzwerkkennwort eingeben';

procedure TForm1.Button1Click(Sender: TObject);
const
  TargetName = 'Blindschacht';
var
  UserName: array [0..CRED_MAX_USERNAME_LENGTH] of Char;
  Password: array [0..CREDUI_MAX_PASSWORD_LENGTH] of Char;
  Info: TCredUIInfo;
  Save: BOOL;
  Flag: DWORD;
begin
  ZeroMemory(@UserName, SizeOf(UserName));
  ZeroMemory(@Password, SizeOf(Password));
  ZeroMemory(@Info, SizeOf(TCredUIInfo));
  with Info do
  begin
    cbSize := SizeOf(TCredUIInfo);
    hwndParent := Handle;
    pszMessageText := PChar(Format(MessageText, [TargetName]));
    pszCaptionText := PChar(CaptionText);
  end;
  Save := False;
  Flag := CREDUI_FLAGS_DO_NOT_PERSIST or CREDUI_FLAGS_EXCLUDE_CERTIFICATES or
    CREDUI_FLAGS_GENERIC_CREDENTIALS or CREDUI_FLAGS_ALWAYS_SHOW_UI;
  ShowMessage(SysErrorMessage(
    CredUIPromptForCredentials(@Info, 'Foo', nil, 0,
      UserName, CRED_MAX_USERNAME_LENGTH+1,
      Password, CREDUI_MAX_PASSWORD_LENGTH+1,
      Save, Flag)));
  ZeroMemory(@UserName, SizeOf(UserName));
  ZeroMemory(@Password, SizeOf(Password));
end;
Im Anhang gibt's die benötigte Unit WinCred.pas (frag nich, hatte gerade Langweile ;))

kiar 11. Jul 2004 12:06

Re: Netzwerkkennwort dialog anzeigen
 
hallo nico,

könntest du nicht öfter langeweile haben :?: :mrgreen:

raik

NicoDE 11. Jul 2004 12:12

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von kiar
könntest du nicht öfter langeweile haben :?: :mrgreen:

OT: Was kann ich dafür, wenn C-Compiler so lange brauchen ;)
Und irgendjemand muss da nochmal durch und die Parameter auf var/out/const (in/out/optional) überprüfen und eventuell Wrapper schreiben damit das Programm auf älteren Windows-Versionen noch startet...

DaFox 11. Jul 2004 12:33

Re: Netzwerkkennwort dialog anzeigen
 
Nico, klasse!! Wieder was gelernt.
Aber was machst bei Windows < XP?

Gruß,
Markus

PS: Den Dialog hab' ich als Resource nur in WinInet.dll gefunden...

SleepyMaster 11. Jul 2004 14:07

Re: Netzwerkkennwort dialog anzeigen
 
Jo! Super 1000 Dank! Echt spitze!

NicoDE 11. Jul 2004 16:09

Re: Netzwerkkennwort dialog anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DaFox
Aber was machst bei Windows < XP?

Keine Ahnung.
Ich kenne in der Richtung nur noch den 'Xxx auswählen'-Dialog (die objsel.dll ruft den 'Netzwerkkennwort eingeben'-Dialog auf... vielleicht gibt's ja ein Flag um das selbst anzeigen zu lassen... MSDN/Google/Mathias).
Delphi-Quellcode:
uses
  ActiveX, ObjSel;

////////////////////////////////////////////////////////////////////////////////
//
//  Test - 'Select User' dialog
//

function InitObjectPicker(Picker: IDsObjectPicker): HRESULT;
var
  ScopeInit: array [0..0] of TDSOPScopeInitInfo;
  InitInfo: TDSOPInitInfo;
begin
  if nil = Picker then
    Result := E_INVALIDARG
  else
  begin
    ZeroMemory(@ScopeInit, SizeOf(ScopeInit));
    ScopeInit[0].cbSize := SizeOf(TDSOPScopeInitInfo);
    ScopeInit[0].flType := DSOP_SCOPE_TYPE_TARGET_COMPUTER;
    ScopeInit[0].flScope := DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
    ScopeInit[0].FilterFlags.Uplevel.flBothModes := DSOP_FILTER_USERS;
    ScopeInit[0].FilterFlags.flDownlevel := DSOP_DOWNLEVEL_FILTER_USERS;

    ZeroMemory(@InitInfo, SizeOf(InitInfo));
    InitInfo.cbSize := SizeOf(InitInfo);
    InitInfo.cDsScopeInfos := SizeOf(ScopeInit) div SizeOf(TDSOPScopeInitInfo);
    InitInfo.aDsScopeInfos := @ScopeInit;
    InitInfo.flOptions := DSOP_FLAG_SKIP_TARGET_COMPUTER_DC_CHECK;

    Result := Picker.Initialize(InitInfo);
  end;
end;

function ProcessSelectedObjects(DatObj: IDataObject): HRESULT;
var
  StgMed: TStgMedium;
  FmtEtc: TFormatEtc;
  SelLst: PDSSelectionList;
  Index: ULONG;
  Text: string;
begin
  if nil = DatObj then
    Result := E_INVALIDARG
  else
  begin
    with FmtEtc do
    begin
      cfFormat := RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
      ptd     := nil;
      dwAspect := DVASPECT_CONTENT;
      lindex  := -1;
      tymed   := TYMED_HGLOBAL;
    end;
    Result := DatObj.GetData(FmtEtc, StgMed);
    if Succeeded(Result) then
    begin
      SelLst := PDS_SELECTION_LIST(GlobalLock(StgMed.hGlobal));
      if SelLst <> nil then
      try
        Text := '';
        for Index := 0 to SelLst.cItems - 1 do
        begin
          Text := Text + Format(
            'Object : %u'#13#10 +
            ' Name : %s'#13#10 +
            ' Class: %s'#13#10 +
            ' Path : %s'#13#10 +
            ' UPN : %s'#13#10, [
            Index,
            WideCharToString(SelLst.aDsSelection[Index].pwzName),
            WideCharToString(SelLst.aDsSelection[Index].pwzClass),
            WideCharToString(SelLst.aDsSelection[Index].pwzADsPath),
            WideCharToString(SelLst.aDsSelection[Index].pwzUPN)]);
        end;
        ShowMessage(Text);
      finally
        GlobalUnlock(StgMed.hGlobal);
      end
      else
        Result := E_POINTER;

      ReleaseStgMedium(StgMed);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Picker: IDsObjectPicker;
  DatObj: IDataObject;
begin
  if Succeeded(CoInitialize(nil)) then
  try
    if Succeeded(CoCreateInstance(CLSID_DsObjectPicker, nil,
      CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, Picker)) then
    try
      if Succeeded(InitObjectPicker(Picker)) then
        case Picker.InvokeDialog(Self.Handle, DatObj) of
          S_OK:
            try
              ProcessSelectedObjects(DatObj);
            finally
              DatObj := nil;
            end;
          S_FALSE:
            ShowMessage('Dialog wurde vom Benutzer abgebrochen.');
        end;
    finally
      Picker := nil;
    end;
  finally
    CoUninitialize;
  end;
end;

MathiasSimmack 11. Jul 2004 16:19

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von NicoDE
vielleicht gibt's ja ein Flag um das selbst anzeigen zu lassen... MSDN/Google/Mathias).

Erst bin ich ein Google-Suchbegriff (@DaFox: ;)), jetzt ein Flag. :shock:

NicoDE 11. Jul 2004 16:22

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von MathiasSimmack
Erst bin ich ein Google-Suchbegriff (@DaFox: ;)), jetzt ein Flag. :shock:

War nicht böse gemeint, aber bei solch einem Flag-Monster wie dem Objektauswahl-Dialog, musste ich unweigerlich an die undokumentierten Shell-Fnktionen denken :)

topic: der 'Netzwerkkennwort eingeben'-Dialog kommt wahrscheinlich wenn versucht wird Objekte von anderen Rechnern (mit o.g. Funktion) anzeigen zu lassen - damit herumzuspielen überlasse ich dem geneigten Entwickler :)

MathiasSimmack 11. Jul 2004 16:52

Re: Netzwerkkennwort dialog anzeigen
 
Ich hab´s auch nicht böse aufgefasst. Ich musste nur daran denken, dass es Leute gibt, die meinen Namen in Suchmaschinen eintippen ... und DaFox meinte, er stolpert dann in seinen Log-Files drüber. :? Was wollen diese Leute erfahren? Und warum fragen sie nicht einfach mich?

Abgesehen davon hast du mich erwischt. Undokumentierte API-Funktionen haben mich schon immer interessiert. ;)

DaFox 11. Jul 2004 17:37

Re: Netzwerkkennwort dialog anzeigen
 
Hi Mathias!

Zitat:

Zitat von MathiasSimmack
Was wollen diese Leute erfahren?

Deine Maße, deine Essgewohnheiten oder evtl. das Buch, das Du Dir nachts unters Kissen legst?! :mrgreen: I don't know...
Ich würde es einfach als Anerkennung Deiner guten Arbeit ansehen.

Gruß,
Markus

NicoDE 11. Jul 2004 17:54

Re: Netzwerkkennwort dialog anzeigen
 
Zitat:

Zitat von MathiasSimmack
Abgesehen davon hast du mich erwischt. Undokumentierte API-Funktionen haben mich schon immer interessiert. ;)

Nunja, die ist aber nicht undokumentiert... :D

TOPIC: Nach einem Blick auf CPasswordDialog (objsel.dll) sieht es erstmal so aus als ob man den nicht direkt aufrufen kann. Er wird anscheinend nur von den internen Klassen CBindInfo und CServerInfo (AskForCredsViaSendMessage/AskForCredsViaPostMessage) aufgerufen. Und das scheint nur der Falle zu sein, falls man den Objektauswahl-Dialog (s.o.) aufruft um Objekte von anderen Systemen abzufragen...

...bleibt also die Frage was Du vorher gemacht hast um diesen Dialog zu sehen (und ob Du nur den Passwort-Dialog anzeigen willst - dann halt nur ab WinXP mit Angabe eines ähnlichen Textes wie CPasswordDialog (s.w.o)).


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz