Como podrás ver envíe esta pregunta también al tablón pero acudo a ti como experto mejor evaluado en la materia. En mi aplicación en Delphi que estoy haciendo como trabajo de diploma necesito validar si un usuario y clave ya conocido por mi es parte del grupo de usuarios del dominio al cual pertenece la maquina donde se esta ejecutando la aplicación, para a partir de ahí darle ciertos privilegios de usar mi aplicación, necesito urgentemente tu respuesta pues mi trabajo de diploma lo discutiré muy pronto...
Dejame ver si te entiendo bien: El usuario ingresa un login y password y lo validas. Ademas dicho usuario debes de buscarlo en la tabla de usuarios de acceso de la computadora que maneja Windows ¿estoy en lo cierto? Si estoy en lo cierto y necesitas revisar las tablas de usuarios de windows es algo un poco más haya de lo que he hecho, pero puedo darte un par de tips de como se puede hacer: Con esto puedes saber el nombre del domino de la maquina, ya que el usuario depende al un dominio en partciular ¿no? procedure TForm1.Button1Click(Sender: TObject); var Registro: TRegistry; begin Registro := TRegistry.Create; Registro.RootKey := HKEY_LOCAL_MACHINE; Registro.OpenKey( 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', False ); Label1.Caption := Registro.ReadString( 'DefaultDomainName' ); Registro.CloseKey; Registro.Destroy; end; Nota: hay que usar el uses registry El nombre del usuario se obtiene con esta función, ya se que no te sirve de mucho el nombre del usuario, pero te lo dejo para que veas que este nombre esta guardado en una API, es decir, si revisar as funciones API de Win32 tal vez encuentres una que te regrese los usuarios registrados: function GetUserName : String; var pcUser : PChar; dwUSize : DWORD; begin dwUSize := 21; GetMem( pcUser, dwUSize ); try if Windows.GetUserName( pcUser, dwUSize ) then Result := pcUser finally FreeMem( pcUser ); end; end; Finalmente solo puedo indicarte como se obtiene una lista de usuarios de windows definidos mediante acceso telefónico a redes. procedure TForm1.Button1Click(Sender: TObject); var bufsize, numEntries,r : longint; Entradas,p : PRasEntryName; x, iTemp : integer; Nombre,Clave : String; fp : LongBool; c : Array[0..100] of Char; DialParams :TRasDialParams; begin Memo1.Lines.Clear; Entradas := AllocMem(SizeOf(TRasEntryName)); Entradas^.dwSize := SizeOf(TRasEntryName); bufsize := SizeOf(TRasEntryName); iTemp := RasEnumEntries(nil, nil, Entradas, bufsize, numEntries); if iTemp = ERROR_BUFFER_TOO_SMALL then begin ReallocMem(Entradas, bufsize); FillChar(Entradas^, bufsize, 0); Entradas^.dwSize := SizeOf(TRasEntryName); iTemp := RasEnumEntries(nil, nil, Entradas, bufsize, numEntries); end; if iTemp = 0 then begin if numEntries > 0 then begin p:=Entradas; for x := 0 to numEntries - 1 do begin {Obtenemos Login & Password de la cuenta} FillChar(dialparams, SizeOf(TRasDialParams), 0); with dialparams do begin dwSize := Sizeof(TRasDialParams); StrPCopy(szEntryName, p^.szEntryName); end; r:=RasGetEntryDialParams(nil, dialparams, fp); if r = 0 then with dialparams do begin Nombre := szUserName; if fp then Clave := szPassword; end else begin RasGetErrorString(r, c, 100); Raise Exception.Create('Error: ' + c); end; Memo1.Lines.Add( 'Cuenta:'+String(p^.szEntryName)+ ' Login: '+Nombre+ ' Clave:'+Clave); Inc(p); end; end; end else Raise Exception.Create('Error en RasEnumEntries'); FreeMem(Entradas); end; Lamento no poder ayudarte mejor pero es un linea y seguramente te dará una idea de como hacerlo
Hola cestrada, gracias por su respuesta, la cual creo que ha sido muy buena, solo me queda por aclarar un par de estructuras que utiliza y no se como están definidas, estas son PRasEntryName, que es un apuntador a RasEntryName, ¿pero eso si no tengo idea de que sea así que por favor podría darme su definición? Y la otra es la TRasDialParams. Ademas si tienes ya, como es de suponer la definición de las API que utilizas, seria ideal si pudiera obtenerlas... Perdona mi insistencia y Gracias porque desde ya me has sido de mucha ayuda... Una cosa, no tengo que acceder al servidor a través de lineas telefónicas, por el momento, solo en redes conectadas por cable, ¿aunque no debe hacer diferencia no?
Mil disculpas! Se me olvida que las APIRAS, delphi no las trae definidas. De hecho, cuando probé este código (que te reitero, vi en trucomania) ahí mismo viene el código de la RASAPI donde se definen estos valores: http://www.q3.nu/trucomania/truco.cgi?103&esp No creo que haya diferencia entre una conexión RAS y una vía cable, pero habría que probar. Te recomiendo que cheques otros trucos (códigos) del mismo sitio de trucomania, hay cosas extraodinariamente buenas y muy sencillas, muchas veces uno como programador se cierra a lo que el propio lenguaje le ofrece y olvida de que el sistema operativo tiene ya implementadas muchas cosas muy útiles para nosotros, como las API's que mencionas. Estas APIs son funciones en una DLL de Windows que podemos utilizar tan solo con definir ShellApi en nuestro Uses. Puedes ver esto en la ayuda de Windows32, no en la de delphi.