Nueva aplicación desarrollada por ProyectoA 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 Delphi 6, es open source por lo que podréis descargar el código fuente aquí.
- Características más importantes.
- Algunas opciones de la aplicación.
- Datos técnicos.
- Descarga de la aplicación gratuita.
- Anexo.
Características más importantes de AjpdSoft Conectar unidad de red
Hemos publicado esta nueva aplicación, 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 conectarUnidadRed.exe, que se incluye en la descarga del código fuente.
- 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ña 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»:
Si el usuario, la contraseña y la ruta UNC son correctos nos mostrará un mensaje como este:
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:
- 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»:
Si todo es correcto tras desconectarla la aplicación nos mostrará este mensaje:
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:
- 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.
- Conectará una nueva unidad virtual de red llamada «W:» que apuntará al recurso compartido: «pcalonsoportatil».
- La aplicación se cerrará de forma automática tras realizar estas acciones.
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 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):
- Windows XP Theme Manager 1.10.1: adaptar la aplicación al tema visual de Windows (gratuito – freeware).
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:
Anexo
Listado del código fuente (source code) en Delphi 6
A continuación os mostramos el listado del código fuente (en Borland Delphi 6) de la aplicación AjpdSoft Conectar unidad de red:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
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('https://www.proyectoa.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. |