Hola Gustavo, te lo puse para que lo ejecutaras desde la linea de comandos, pero desde delphi, yo hago esto:
Código Delphi
[-]
ShellExecute_AndWait(
PChar(ExtractFilePath(GetIBServerDataBase)+'bin\gsec.exe'),
PChar('-USER SYSDBA -PASSWORD '+DatosSesion.Password+
' -modify '+Nombre+' -pw '+Clave),
PChar(ExtractFilePath(GetIBServerDataBase)+'bin'));
// Con esta funcion, averigüo la ruta donde está el gsec.exe
// mirando en el registro de windows las distintas claves, según el motor y // version del mismo
Código Delphi
[-]
function GetIBServerDataBase:string;
var Reg:TRegistry;
FbsecuriyFile, FbsecuriyFile2, FbISC4: String;
begin
Reg:=TRegistry.create;
try
Reg.Access:=KEY_READ;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Not reg.OpenKey('SOFTWARE\Firebird Project\Firebird Server\Instances',false)
then begin
if Not reg.OpenKey('Software\FireBirdSQL\FireBird\CurrentVersion',false)
then if Not reg.OpenKey('Software\Borland\InterBase\CurrentVersion',false)
then if Not reg.OpenKey('Software\InterBase Corp\InterBase\CurrentVersion',false)
then Raise Exception.Create('Interbase no está instalado en este equipo');
FbsecuriyFile:=reg.ReadString('RootDirectory');
end
else begin
FbsecuriyFile:=reg.ReadString('DefaultInstance');
end;
if Length(FbsecuriyFile)<=0
then Raise Exception.create('Interbase no está instalado en este equipo');
if FbsecuriyFile[length(FbsecuriyFile)]='\'
then FbsecuriyFile:=Copy(FbsecuriyFile,1,Length(FbsecuriyFile)-1);
FbISC4 := FbsecuriyFile + '\isc4.gdb';
FbsecuriyFile2 := FbsecuriyFile + '\security2.fdb';
FbsecuriyFile := FbsecuriyFile + '\security.fdb';
if FileExists(FbsecuriyFile2)
then Result := FbsecuriyFile2
else if FileExists(FbsecuriyFile)
then Result := FbsecuriyFile
else if FileExists(FbISC4)
then Result := FbISC4
else Result := InputBox('No se encuentró la B.D. de USUARIOS de InterBase/FireBird.',
'Teclee la ruta completa del fichero "security2.fdb", "security.fdb" o "isc4.gdb"',
'C:\Archivos de programa\Firebird\FireBird_2_0\security2.fdb');
finally
Reg.free;
end;
end;
// este procedimiento ejecuta un programa externo
Código Delphi
[-]
procedure ShellExecute_AndWait(const FileName, Params, RutaDirectorio: string);
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
lpVerb := 'open';
lpParameters := PChar(Params);
lpFile := PChar(FileName);
lpDirectory := PChar(RutaDirectorio);
nShow := SW_HIDE; end;
if ShellExecuteEx(@exInfo)
then Ph := exInfo.HProcess
else begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
end;