Ver Mensaje Individual
  #1  
Antiguo 07-02-2011
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Reputación: 18
cesarsoftware Va por buen camino
Registro Windows 7 y privilegios

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 // aqui esta el error en windows7
    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'); // SE_CREATE_TOKEN_NAME
    derechos.Add('SeAssignPrimaryTokenPrivilege'); // SE_ASSIGNPRIMARYTOKEN_NAME
    derechos.Add('SeLockMemoryPrivilege'); // SE_LOCK_MEMORY_NAME
    derechos.Add('SeIncreaseQuotaPrivilege'); // SE_INCREASE_QUOTA_NAME
    derechos.Add('SeUnsolicitedInputPrivilege'); // SE_UNSOLICITED_INPUT_NAME
    derechos.Add('SeMachineAccountPrivilege'); // SE_MACHINE_ACCOUNT_NAME
    derechos.Add('SeTcbPrivilege'); // SE_TCB_NAME
    derechos.Add('SeSecurityPrivilege'); // SE_SECURITY_NAME
    derechos.Add('SeTakeOwnershipPrivilege'); // SE_TAKE_OWNERSHIP_NAME
    derechos.Add('SeLoadDriverPrivilege'); // SE_LOAD_DRIVER_NAME
    derechos.Add('SeSystemProfilePrivilege'); // SE_SYSTEM_PROFILE_NAME
    derechos.Add('SeSystemtimePrivilege'); // SE_SYSTEMTIME_NAME
   derechos.Add('SeProfileSingleProcessPrivilege');{SE_PROF_SINGLE_PROCESS_NAME}
    derechos.Add('SeIncreaseBasePriorityPrivilege'); {SE_INC_BASE_PRIORITY_NAME}
    derechos.Add('SeCreatePagefilePrivilege'); // SE_CREATE_PAGEFILE_NAME
    derechos.Add('SeCreatePermanentPrivilege'); // SE_CREATE_PERMANENT_NAME
    derechos.Add('SeBackupPrivilege'); // SE_BACKUP_NAME
    derechos.Add('SeRestorePrivilege'); // SE_RESTORE_NAME
    derechos.Add('SeShutdownPrivilege'); // SE_SHUTDOWN_NAME
    derechos.Add('SeDebugPrivilege'); // SE_DEBUG_NAME
    derechos.Add('SeAuditPrivilege'); // SE_AUDIT_NAME
    derechos.Add('SeSystemEnvironmentPrivilege'); // SE_SYSTEM_ENVIRONMENT_NAME
    derechos.Add('SeChangeNotifyPrivilege'); // SE_CHANGE_NOTIFY_NAME
    derechos.Add('SeRemoteShutdownPrivilege'); // SE_REMOTE_SHUTDOWN_NAME
    FillChar(tkp, sizeof(tkp), 0);
    // Leer el token de este proceso
    OpenProcessToken(GetCurrentProcess,
                     TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
    // Leer el LUID para privilegios de cambiar registro
    LookupPrivilegeValue(nil, PChar(derechos.Strings[id]),
                         tkp.Privileges[0].Luid);
    tkp.PrivilegeCount := 1; // se asigna 1 privilegio
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    // Ajustar el privilegio cambiar registro para este proceso
    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.

Última edición por Neftali [Germán.Estévez] fecha: 07-02-2011 a las 16:42:32. Razón: Añadir TAG's al código
Responder Con Cita