Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-02-2011
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 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
  #2  
Antiguo 07-02-2011
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Se me olvidaba decir que en windows7 solo me permite coger los privilegios de
SeShutdownPrivilege y SeChangeNotifyPrivilege

Gracias
Responder Con Cita
  #3  
Antiguo 07-02-2011
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 17
mcs Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 07-02-2011
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 07-02-2011
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
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)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Registro de Windows Khronos Varios 2 07-12-2008 23:23:28
Privilegios y Windows Vista mrtossas API de Windows 3 19-11-2008 22:35:31
Registro en windows disponible para todos los usuarios y sin privilegios de admin papulo API de Windows 8 10-06-2008 12:11:06
registro de windows JULIPO Varios 4 26-07-2007 08:17:01
Uso de registro de Windows Alcolea Windows 3 05-06-2006 21:47:35


La franja horaria es GMT +2. Ahora son las 14:12:17.


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
Copyright 1996-2007 Club Delphi