Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Delphi: AjpdSoft Conectar unidad de red Código fuente Delphi
AjpdSoft


Nueva aplicación desarrollada por AjpdSoft que permite conectar unidades de red a partir de una ruta de red (nombre de servidor - nombre del recurso compartido). Esta aplicación también permite realizar la desconexión de una unidad de red existente. La aplicación ha sido desarrollada en Borland (ahora Codegear) Delphi 6, es 100% Open Source por lo que podréis descargar el código fuente aquí.



Características más importantes de AjpdSoft Conectar unidad de red

Hemos añadido esta nueva aplicación a nuestro proyecto AjpdSoft, desarrollada por nuestros técnicos. AjpdSoft Conectar unidad de red permite conectar y desconectar unidades de red en segundos. Permite guardar los últimos valores utilizados. Esta aplicación puede conectar una unidad de red (o desconectar) de forma automática y transparente para el usuario. Tiene las siguientes características:

  • De muy sencillo manejo, con una única ventana, desde la que se pueden realizar todas las acciones.
  • No necesita instalación, es suficiente con el ejecutable y la base de datos (usuarios.mdb).
  • Permite la creación de unidades de red con un usuario y contraseña diferentes al del usuario que ha iniciado sesión y ha ejecutado la aplicación.
  • Puede configurarse para conectar una unidad de red de forma automática al iniciar la aplicación.

Algunas opciones de AjpdSoft Conectar unidad de red

A continuación os mostramos captura de pantalla de las opciones más importantes de la aplicación:

  • Conectar unidad de red: introduciendo la ruta UNC (convención de nomenclatura universal o Universal Naming Convention) que consiste en dos barras invertidas, seguidas del nombre del equipo (hostname) en la red, seguida de otra barra invertida y el nombre del recurso compartido. Por ejemplo, supongamos que tenemos un portátil, con nombre de red "pcalonso", en este portátil compartimos una carpeta con el nombre "portatil". En esta situación, para realizar una conexión de red desde otro equipo al portátil y a la carpeta compartida introduciremos en "Ruta UNC" el valor "pcalonsoportatil". En "Letra" seleccionaremos la letra que queramos asignarle a la unidad virtual, por ejemplo "M:". En "Usuario" y "Contraseña" introduciremos el usuario y la contrase del equipo portátil. Por último, si queremos que esta unidad de red esté disponible tras reiniciar el equipo marcaremos la opción "Volver a conectar al iniciar el equipo". Para crear la unidad virtual pulsaremos "Conectar":

AjpdSoft Conectar unidad de red

Si el usuario, la contraseña y la ruta UNC son correctos nos mostrará un mensaje como este:

AjpdSoft Conectar unidad de red

Con el texto:

Conexión a unidad de red realizada correctamente.

Si se produjese algún error aparecería un mensaje indicando el motivo.

Tras crear la unidad de red (unidad virtual) podremos acceder a ella mediante el Explorador de Windows:

AjpdSoft Conectar unidad de red

  • Desconectar unidad de red: la aplicación permite desconectar una unidad de red existente. En "Desconectar unidad de red", en "Letra", seleccionaremos la letra de la unidad de red que queramos desconectar, luego pulsaremos "Desconectar":

AjpdSoft Conectar unidad de red

Si todo es correcto tras desconectarla la aplicación nos mostrará este mensaje:

AjpdSoft Conectar unidad de red

Con el texto:

Unidad de red desconectada correctamente.

  • La aplicación permite también:
    • Desconectar una unidad de red al iniciar la aplicación.
    • Conectar una unidad de red al iniciar la aplicación.
    • Mostrar u ocultar los avisos de error y de proceso de conexión/desconexión realizada.
    • Cerrar aplicación al ejecutar las opciones anteriores.

    Por ejemplo, con la siguiente configuración, la aplicación realizará las siguientes acciones al ejecutarse:

    1. Desconectará la unidad virtual de red "M:", si no existe no dará error, puesto que hemos desmarcado la opción "Mostrar avisos de error y de proceso concluido.
    2. Conectará una nueva unidad virtual de red llamada "W:" que apuntará al recurso compartido: "pcalonsoportatil".
    3. La aplicación se cerrará de forma automática tras realizar estas acciones.

AjpdSoft Conectar unidad de red

  • Un ejemplo del contenido del fichero de configuración:

    [Conectar]
    Ruta=pcalonsoportatil
    Usuario=fernando
    Contraseña=AAAAAA==
    Letra=N:
    Volver a conectar=0
    [Desconectar]
    Letra=N:
    [Opciones inicio]
    Conectar al iniciar=1
    Desconectar al iniciar=1
    Mostrar mensajes=0
    Cerrar al iniciar=1

Datos técnicos de AjpdSoft Conectar unidad de red

La aplicación está desarrollada en Borland (Codegear) Delphi 6, los datos de configuración son guardados en un fichero de texto plano con formato de fichero INI. Para la encriptación de la contraseña se ha utilizado el algoritmo AES.

Para usuarios desarrolladores

La aplicación utiliza los siguientes componentes (para Delphi 6):

Descarga de la aplicación completa gratuita

Por supuesto, como siempre, incluimos el código fuente 100% Open Source (freeware) gratis de la aplicación completa. Si aún no te has registrado puedes hacerlo desde aquí gratuitamente, luego descarga el código fuente desde este enlace:

Código fuente Source Code Open Source de AjpdSoft Conectar unidad de red

Anexo

Listado del código fuente (source code) en Delphi 6

A continuación os mostramos el listadod el código fuente (en Borland Delphi 6) de la aplicación AjpdSoft Conectar unidad de red:

unit UnidadMenuPrincipal;

{$R WinXP.res}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, shellapi, aes, base64, inifiles, ThemeMgr;

type
  TformMenuPrincipal = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    txtRuta: TEdit;
    Label2: TLabel;
    txtUsuario: TEdit;
    txtContrasena: TEdit;
    Label3: TLabel;
    bConectar: TBitBtn;
    LWEB: TLabel;
    Label4: TLabel;
    lsLetra: TComboBox;
    GroupBox2: TGroupBox;
    bDesconectar: TBitBtn;
    lsLetraDesconectar: TComboBox;
    Label5: TLabel;
    opReconectar: TCheckBox;
    ThemeManager1: TThemeManager;
    GroupBox3: TGroupBox;
    opConectarUnidadInicio: TCheckBox;
    opDesconectarInicio: TCheckBox;
    opMostrarAvisos: TCheckBox;
    opCerrarAlIniciar: TCheckBox;
    Label6: TLabel;
    procedure LWEBClick(Sender: TObject);
    procedure bConectarClick(Sender: TObject);
    procedure bDesconectarClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  formMenuPrincipal: TformMenuPrincipal;

implementation

{$R *.dfm}

function cifrarTexto (Str, Clave : String) : String;
var
  Src: TStringStream;
  Dst: TMemoryStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  Result:= EmptyStr;
  Src:= TStringStream.Create(Str);
  try
    Dst:= TMemoryStream.Create;
    try
      // Preparamos la clave, lo ideal es que tenga 32 caracteres
      FillChar(Key,Sizeof(Key),#0);
      if Length(Clave) > Sizeof(Key) then
        move(PChar(Clave)^,Key,Sizeof(key))
      else
        move(PChar(Clave)^,Key,Length(Clave));
      AEsExpandKey(ExpandedKey,Key);
      // Guardamos el tamaño del texto original
      Size:= Src.Size;
      Dst.WriteBuffer(Size,Sizeof(Size));
      // Ciframos el texto
      AESEncryptStreamECB(Src,Dst,ExpandedKey);
      // Lo codificamos a base64
      Result:= BinToStr(Dst.Memory,Dst.Size);
    finally
      Dst.Free;
    end;
  finally
    Src.Free;
  end;
end;

function descifrarTexto (Str, Clave : String): String;
var
  Src: TMemoryStream;
  Dst: TStringStream;
  Size: Integer;
  Key: TAESKey;
  ExpandedKey: TAESExpandedKey;
begin
  if Str <> '' then
  begin
    Result:= EmptyStr;
    Src:= TMemoryStream.Create;
    try
      Dst:= TStringStream.Create(Str);
      try
        StrToStream(Str,Src);
        Src.Position:= 0;
        FillChar(Key,Sizeof(Key),#0);
        if Length(Clave) > Sizeof(Key) then
          move(PChar(Clave)^,Key,Sizeof(key))
        else
          move(PChar(Clave)^,Key,Length(Clave));
        AESExpandKey(ExpandedKey,Key);
        // Leemos el tamaño del texto
        Src.ReadBuffer(Size,Sizeof(Size));
        AESDecryptStreamECB(Src,Dst,ExpandedKey);
        Dst.Size:= Size;
        Result:= Dst.DataString;
      finally
        Dst.Free;
      end;
    finally
      Src.Free;
    end;
  end
  else
    Result := EmptyStr;
end;

//Lee un booleano de un INI
function leBoolINI (clave, cadena : string; defecto : boolean) : boolean;
begin
  with tinifile.create (changefileext(paramstr(0),'.ini')) do
  try
    result := readbool (clave, cadena, defecto);
  finally
    free;
  end;
end;


//Lee una cadena de texto de un INI
function leCadINI (clave, cadena : string; defecto : string) : string;
begin
  with tinifile.create (changefileext(paramstr(0),'.ini')) do
  try
    result := readString (clave, cadena, defecto);
  finally
    free;
  end;
end;


//escribe un Booleano en un INI
procedure esBoolINI (clave, cadena : string; valor : boolean);
begin
  with tinifile.create (changefileext(paramstr(0),'.ini')) do
  try
    writeBool (clave, cadena, valor);
  finally
    free;
  end;
end;


//escribe una cadena de texto en un INI
procedure esCadINI (clave, cadena, valor : string);
begin

  with tinifile.create (changefileext(paramstr(0),'.ini')) do
  try
    writeString (clave, cadena, valor);
  finally
    free;
  end;
end;

function conectarUnidad(letraUnidad : string; rutaUnidad : string;
    contrasenaUsuario : string; nombreUsuario : string;
    mostrarError : Boolean;
  reconectarAlIniciar : Boolean): DWORD;
var
  nRes: TNetResource;
  errCode: DWORD;
  dwFlags: DWORD;
begin
{  FillChar(NRes, SizeOf(NRes), #0);
  nRes.dwType := RESOURCETYPE_DISK;
  nRes.lpLocalName  := PChar(letraUnidad);
  nRes.lpRemoteName := PChar(rutaUnidad);
  if reconectarAlIniciar then
    dwFlags := CONNECT_UPDATE_PROFILE and CONNECT_INTERACTIVE
  else
    dwFlags := CONNECT_INTERACTIVE;

  errCode := WNetAddConnection3(formMenuPrincipal.Handle,
      nRes, nil, nil, dwFlags);
  if (errCode <> NO_ERROR) and (mostrarError) then
  begin
    Application.MessageBox(PChar('No se ha podido conectar la unidad:'
        + #13#10 +
        SysErrorMessage(GetLastError)), 'Error al conectar unidad de red',
        MB_ICONERROR + MB_OK);
  end;
  Result := errCode;}

  FillChar(NRes, SizeOf(NRes), #0);
  nRes.dwType := RESOURCETYPE_DISK;
  nRes.lpLocalName  := PChar(letraUnidad);
  nRes.lpRemoteName := PChar(rutaUnidad);
  if reconectarAlIniciar then
    dwFlags := CONNECT_UPDATE_PROFILE and CONNECT_INTERACTIVE
  else
    dwFlags := CONNECT_INTERACTIVE;

  if (contrasenaUsuario = '') and (nombreUsuario = '') then
    errCode := WNetAddConnection3(formMenuPrincipal.Handle, nRes,
        nil, nil, dwFlags)
  else
    errCode := WNetAddConnection3(formMenuPrincipal.Handle, nRes,
        pchar(contrasenaUsuario), pchar(nombreUsuario), dwFlags);

  if (errCode <> NO_ERROR) and (mostrarError) then
  begin
    Application.MessageBox(PChar('No se ha podido conectar la unidad [' +
        letraUnidad + ']' + #13#10 +
        SysErrorMessage(GetLastError)), 'Error al conectar unidad de red',
        MB_ICONERROR + MB_OK);
  end;
  Result := errCode;
end;

function desconectarUnidad (letraUnidad : string; mostrarError : Boolean;
    forzarDesconexion : Boolean; guardar : Boolean): DWORD;
var
  dwFlags: DWORD;
  errCode: DWORD;
begin
  if guardar then
    dwFlags := CONNECT_UPDATE_PROFILE
  else
    dwFlags := 0;
  errCode := WNetCancelConnection2(PChar(letraUnidad), dwFlags,
      forzarDesconexion);
  if (errCode <> NO_ERROR) and (mostrarError) then
  begin
    Application.MessageBox(PChar('Error al desconectar unidad de red:'
        + #13#10 + SysErrorMessage(GetLastError)),
        'Error al desconectar',  MB_ICONERROR + MB_OK);
  end;
  Result := errCode;
end;


procedure TformMenuPrincipal.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

procedure TformMenuPrincipal.bConectarClick(Sender: TObject);
begin
  if conectarUnidad(lsLetra.Text, txtRuta.Text, txtContrasena.Text,
      txtUsuario.Text, true, opReconectar.Checked) = 0 then
    Application.MessageBox(PChar('Conexión a unidad de red realizada ' +
        ' correctamente.'),
        'Conexión realizada', MB_ICONINFORMATION + MB_OK);
end;

procedure TformMenuPrincipal.bDesconectarClick(Sender: TObject);
begin
  if desconectarUnidad(lsLetra.Text, true, true, true) = 0 then
   Application.MessageBox(PChar('Unidad de red desconectada correctamente.'),
       'Desconexión realizada', MB_ICONINFORMATION + MB_OK);
end;

procedure TformMenuPrincipal.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  esCadINI('Conectar', 'Ruta', txtRuta.Text);
  esCadINI('Conectar', 'Usuario', txtUsuario.Text);
  esCadINI('Conectar', 'Contraseña',
      Trim (cifrarTexto (txtContrasena.Text, '00ajpdsoft11')));
  esCadINI('Conectar', 'Letra', lsLetra.Text);
  esBoolINI('Conectar', 'Volver a conectar', opReconectar.Checked);
  esCadINI('Desconectar', 'Letra', lsLetraDesconectar.Text);
  esBoolINI('Opciones inicio', 'Conectar al iniciar',
      opConectarUnidadInicio.Checked);
  esBoolINI('Opciones inicio', 'Desconectar al iniciar',
      opDesconectarInicio.Checked);
  esBoolINI('Opciones inicio', 'Mostrar mensajes',
      opMostrarAvisos.Checked);
  esBoolINI('Opciones inicio', 'Cerrar al iniciar',
      opCerrarAlIniciar.Checked);

end;

procedure TformMenuPrincipal.FormCreate(Sender: TObject);
begin
  txtRuta.Text := leCadINI('Conectar', 'Ruta', '');
  txtUsuario.Text := leCadINI('Conectar', 'Usuario', '');
  txtContrasena.Text :=
      descifrarTexto (leCadINI('Conectar', 'Contraseña', ''),
      '00ajpdsoft11');
  lsLetra.Text := leCadINI('Conectar', 'Letra', '');
  opReconectar.Checked := leBoolINI('Conectar',
      'Volver a conectar', false);
  lsLetraDesconectar.Text := leCadINI('Desconectar', 'Letra', '');
  opConectarUnidadInicio.Checked := leBoolINI('Opciones inicio',
      'Conectar al iniciar', false);
  opDesconectarInicio.Checked := leBoolINI('Opciones inicio',
      'Desconectar al iniciar', false);
  opMostrarAvisos.Checked := leBoolINI('Opciones inicio',
      'Mostrar mensajes', false);
  opCerrarAlIniciar.Checked := leBoolINI('Opciones inicio',
      'Cerrar al iniciar', false);

  if opDesconectarInicio.Checked then
  begin
    if desconectarUnidad(lsLetra.Text, opMostrarAvisos.Checked,
        true, true) = 0 then
      if opMostrarAvisos.Checked then
        Application.MessageBox(PChar('Unidad de red desconectada ' +
            'correctamente.'),
            'Desconexión realizada', MB_ICONINFORMATION + MB_OK);
  end;
  if opConectarUnidadInicio.Checked then
  begin
    if conectarUnidad(lsLetra.Text, txtRuta.Text, txtContrasena.Text,
        txtUsuario.Text, opMostrarAvisos.Checked,
        opReconectar.Checked) = 0 then
      if opMostrarAvisos.Checked then
        Application.MessageBox(PChar('Conexión a unidad de red ' +
            'realizada correctamente.'),
            'Conexión realizada', MB_ICONINFORMATION + MB_OK);
  end;
  if opCerrarAlIniciar.Checked then
   if HiWord(GetKeyState(VK_SHIFT)) = 0 then
     Application.Terminate;
end;


end.
 

 

Artículos relacionados

Créditos

Aplicación desarrollada íntegramente por Alonsojpd, miembro fundador del proyecto AjpdSoft.



Nota: Revisado por AjpdSoft el 18-09-2010.
Anuncios


Enviado el Jueves, 19 febrero a las 23:46:48 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A