Hola foreros, nuevamente acudo a Ustedes para ver si me pueden ayudar a resolver un problema.
Tengo una aplicacion que crea una clave en registro, pero....no funciona en windows 7, me da error, este es el codigo
Código Delphi
[-]
function TFormRegistrar.RegistraClave(usuario,
localidad,
licencias,
clave: string): boolean;
var
pass, user, city, lics, s: string;
begin
pass := ''; city := ''; user := ''; lics := '';
pass := Cifra(clave);
lics := Cifra(licencias);
city := Cifra(localidad);
user := Cifra(usuario);
with TRegistry.Create do
try
RootKey := HKEY_CLASSES_ROOT;
if OpenKey(Descifra(programa), True) then begin
WriteString(s_usuario, user);
WriteString(s_localidad, city);
WriteString(s_licencias, lics);
WriteString(s_clave, pass);
CloseKey();
Result := True;
end
else
begin
s := 'HKEY_CLASSES_ROOT\'+ Descifra(programa);
Application.MessageBox(PChar(s), 'Error RegEdit', MB_OK);
Result := False;
end;
finally
Free;
end;
end;
Estoy casi seguro que es un tema de privilegios pero tampoco me sirve la funcion que uso habitualmente, es esta
function DerechosAdministrador(id: word): Boolean;
var
hToken: THANDLE;
tkp, tkDumb: TTokenPrivileges;
DumbInt: DWord;
derechos: TStringList;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
derechos := TStringList.Create;
derechos.Add('SeCreateTokenPrivilege'); derechos.Add('SeAssignPrimaryTokenPrivilege'); derechos.Add('SeLockMemoryPrivilege'); derechos.Add('SeIncreaseQuotaPrivilege'); derechos.Add('SeUnsolicitedInputPrivilege'); derechos.Add('SeMachineAccountPrivilege'); derechos.Add('SeTcbPrivilege'); derechos.Add('SeSecurityPrivilege'); derechos.Add('SeTakeOwnershipPrivilege'); derechos.Add('SeLoadDriverPrivilege'); derechos.Add('SeSystemProfilePrivilege'); derechos.Add('SeSystemtimePrivilege'); derechos.Add('SeProfileSingleProcessPrivilege');
derechos.Add('SeIncreaseBasePriorityPrivilege');
derechos.Add('SeCreatePagefilePrivilege'); derechos.Add('SeCreatePermanentPrivilege'); derechos.Add('SeBackupPrivilege'); derechos.Add('SeRestorePrivilege'); derechos.Add('SeShutdownPrivilege'); derechos.Add('SeDebugPrivilege'); derechos.Add('SeAuditPrivilege'); derechos.Add('SeSystemEnvironmentPrivilege'); derechos.Add('SeChangeNotifyPrivilege'); derechos.Add('SeRemoteShutdownPrivilege'); FillChar(tkp, sizeof(tkp), 0);
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue(nil, PChar(derechos.Strings[id]),
tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, sizeof(tkDumb), tkDumb, DumbInt);
if GetLastError <> ERROR_SUCCESS then begin
Raise Exception.create('No puedo coger privilegios. Error: ' +
IntToStr(GetLastError));
Result := False;
Exit;
end;
end;
Result := True;
end;
¿Me falta algun tipo de privilegio?
¿Hay que hacerlo de otra manera para windows 7?
Quiero recodar que me funciona todo correctamente en el resto de sistemas, desde windows95 hasta windowsXP.
Gracias de antemano.