Programmanmeldung

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Programmanmeldung

Beitrag von andreas »

Hallo Leute,

ich habe ein Programm, das bei dem Start eine Anmeldung verlangt, um die Zugriffsrechte zu steuern, wobei die Benutzerverwaltung im Programm integriert ist.
Jetzt kommt die Frage, ob ich das nich vereinheitlichen und die Anmeldedaten von dem Windowsserver holen kann. Gibt es eine Möglichkeit die Anmeldedaten (Benutzer und Passwort) von Windows in XBase++ zu ermitteln oder Windows frage, ob die Anmeldedaten stimmen? Als vorschlag wäre vielleicht LDAP zugriff über API, leider kenne ich mich damit nicht aus und meine English-Kenntnisse sind richtig schlecht, um das auf Microsoft-Seiten zu lesen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
ein kleiner Tipp: Wenn Deine Anwendung lokal läuft, kannst Du ja davon ausgehen, dass die Anmeldung geklappt hat (sonst könnte der User das Programm ja nicht starten). Also bräuchtest Du nur noch den Namen des Users, der gerade angemeldet ist - und den findest Du über die entsprechenden Umgebungsvariablen heraus (XP z.B.: USERNAME)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Andreas.

An das Paßwort ist m.E. - auch aus gutem Grund - kein Herankommen, aber den Windows-Benutzernamen kann man recht leicht abfragen:

Code: Alles auswählen

FUNCTION wGetUserName()
  LOCAL nDll, cRetVal := space(256), nRetVal := 0, nSize := 255
  nDll := DllLoad( "ADVAPI32.DLL")
  IF nDll # 0
      DllCall( nDll, DLL_STDCALL, "GetUserNameA", ;
                          @cRetVal, @nSize )
      DllUnload( nDll )
  ENDIF
RETURN ( cRetVal )[color=darkred] // da ist der Benutzername drin[/color]
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin und Tom,

mein Kollege hat bei Microsoft folgenden Artikel gefunden
http://www.microsoft.com/germany/msdn/l ... Teil2.mspx.

Daraus habe ich folgende Funktion geschrieben, die mir logischen Wert liefert, ob die Anmeldedaten stimmen oder nicht.

Code: Alles auswählen

**Konstanten für LogonType
#DEFINE LOGON32_LOGON_INTERACTIVE  2
#DEFINE LOGON32_LOGON_NETWORK  3
#DEFINE LOGON32_LOGON_BATCH  4
#DEFINE LOGON32_LOGON_SERVICE  5
#DEFINE LOGON32_LOGON_UNLOCK  7
#DEFINE LOGON32_LOGON_NETWORK_CLEARTEXT  8
#DEFINE LOGON32_LOGON_NEW_CREDENTIALS  9

**Konstanten für ProviderType
#DEFINE LOGON32_PROVIDER_DEFAULT  0
#DEFINE LOGON32_PROVIDER_WINNT35  1
#DEFINE LOGON32_PROVIDER_WINNT40  2
#DEFINE LOGON32_PROVIDER_WINNT50  3

**Authentifizierung des Benutzers zum Windows-Server überprüfen
FUNCTION CheckLogOn( cUsername, cPasswort, cDomainname )
	LOCAL nRet := 0
	LOCAL nDLL := DLLload("ADVAPI32.DLL")
	local lOk := .f.
	LOCAL lRet := DLLCall(nDLL, DLL_STDCALL, "LogonUserA", cUserName, cDomainname, cPasswort,;
		LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, @nRet)
	DLLUnload(nDLL)

	*msgbox( var2char(lRet) + chr(13) + var2char(nLen) )

	IF nRet > 0
		lOk := .t.
	ENDIF

RETURN lOk
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Andreas,
über:
cName := GetEnv( "USERNAME" ) [ Gruß an Tom: Es geht auch kürzer ;-) ]

ermittelst Du den aktuellen Windows-User.

Wie Tom schon sagte, kann das Passwort eines Users nicht über das API ermittelt werden, sondern nur festgestellt werden, ob das Passwort zum User richtig ist.


Deine Überlegungen machen übrigens m.E. nur dann Sinn, wenn innerhalb Deiner Anwendung die Zugangspassworte zur Anwendung nicht verwaltet werden sondern nur die Benutzernamen. Die Paßwortveriftzierung müßte dann entsprechend über die von Dir dargestellte API-Routine ablaufen. Dies hätte allerdings den Vorteil, dass bei regelmäßiger Änderung des Windows-Paßwortes auch der Zugang zur Anwendung entsprechend gesichert wird, ohne das dies manuell innerhalb der Anwendung händisch nachgpflegt werden muß bzw. dafür spezielle Routinen programmiert werden müssten.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Meiner Kenntnis nach wird statt des Paßworts ein MD5-Hash gespeichert, der lediglich eine Prüfung zuläßt, ob das eingegebene Paßwort auch korrekt ist (also verschlüsselt wieder diesen Hash ergibt), aber keine Entschlüsselung erlaubt.
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Leute,

danke für die Antworten.
Ich wollte eigentlich nur erreichen, dass die Benutzer sich nicht ständig viele Passwörter merken und evtl. bei der Passwortänderung das gleiche Passwort an mehreren Stellen ändern müssen. Das funktioniert mit meiner funktion, die mir sagt, ob die Anmeldedaten stimmen, was mir vollkommen ausreicht. Um die Benutzernamen brauche ich keine Sorgen zu machen, da die bei uns fest vergeben sind und nicht so schnell geändert werden.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Programmanmeldung

Beitrag von brandelh »

Hi,

deine Funktion ist Klasse und eröffnet neue Möglichkeiten - irgendwie hatte ich das schon wieder vergessen oder damals übersehen.
Normalerweise nutze ich zwar auch immer über USERNAME den gleichen Benutzernamen wie der angemeldete und natürlich wird der grundsätzliche Zugang im Programm über Netzwerkregeln geregelt, aber bei einigen Menüpunkten hätte ich schon immer gerne das Kennwort abgefragt.
Nun geht das so - toll.
Gruß
Hubert
Antworten