Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Registro Windows 7 y privilegios (https://www.clubdelphi.com/foros/showthread.php?t=72257)

cesarsoftware 07-02-2011 13:13:53

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.

cesarsoftware 07-02-2011 13:17:29

Se me olvidaba decir que en windows7 solo me permite coger los privilegios de
SeShutdownPrivilege y SeChangeNotifyPrivilege

Gracias

mcs 07-02-2011 13:22:55

En efecto, se trata de un problema de privilegios. Si no tienes los permisos de administrador, sólo puedes escribir en HK_CURRENTUSER (pero si leer las demás ramas del registro).

Pero no te puedo ayudar en lo de subir de privilegios. No sé cómo se hace... De todas formas, no sería más correcto guardar los datos directamente en la configuración de usuario?

cesarsoftware 07-02-2011 18:32:48

Gracias por contestar,
Siempre en guardado en HK_CLASSES_ROOT porque afecta a todos los usuarios, ademas en este caso es un tema de registro de aplicacion junto con la asociacion de archivos, etc. asi que preferiria seguir usando esta clave y de paso solventar el problema.

¿Alguna idea de coger privilengios en windows 7?

Gracias.

cesarsoftware 07-02-2011 18:36:24

Por cierto, "en teoria" el software se ejecuta como administrador o al menos yo soy administrador del dominio (el usuario con el que entro vamos)


La franja horaria es GMT +2. Ahora son las 16:01:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi