Hola quiero aprender el tema de los permisos, privilegios y el uac con la windows api.
Estoy leyendo información en la pagina de microsoft pero todo es muy confuso al principio supongo. Al final quiero conseguir poder comprobar y pedir permisos de administrador, acceder y leer al registro y archivos protegidos.
Yo estoy leyendo esto http://msdn.microsoft.com/en-us/library/windows/desktop/aa374731(v=vs.85).aspx#sspi_functions
Pero si sabéis otro sitio de donde pueda aprender sobre esto?
Saludos
se que no es la forma correcta de hacerlo lo ideal es haciendo el manifest pero funciona y eso para mi basta jeje
#include <iostream>
#include <windows.h>
using namespace std;
int permisosadm();
int main()
{
if(permisosadm()==1)
{
cout << "ya tengo permisos de administrador :D" << endl;
}
else
{
return 0;
}
system("pause");
return 0;
}
int permisosadm()
{
HANDLE archivo;
// abrimos un archivo en c en esa ubicacion necesitamos permisos de administrador
archivo=CreateFile("C:\\random",GENERIC_READ|GENERIC_WRITE ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
//si da error entones no tenemos permisos
if(archivo==INVALID_HANDLE_VALUE)
CloseHandle(archivo);
TCHAR dir[2045];
//la ruta del programa que estamos ejecutando
GetModuleFileName(NULL,dir,2045);
// luego lo vuelve a abrir pero con runas comando que pide permisos de administrador
ShellExecute(NULL,"runas",dir,NULL,NULL,SW_SHOWNORMAL);
// revuelve cero y acaba funcion
return 0;
}
// si llega aca si tiene permisos de admin cierra el archivo y devuelve uno
CloseHandle(archivo);
return 1;
}
Busca el libro 'Windows internals' capitulo de seguridad, de lo mejor.
Hola daryo yo para saber si soy administrador hice algo parecido pero yo intento escribir en el registro y si no me devuelve error 5 soy administrador pero esto no es nada ;D A mi no me basta solo con esto quiero mas.
x64Core encontre el libro parte 1 6 edicion pero son cosas de windows y no hay codigo c/c++ o es esto lo que necesito para entender lo luego en c++?
http://infoman.teikav.edu.gr/~stpapad/WindowsInternalsPart16thEdition.pdf
Parece estar bien y se ve que te explican muchas.
Dentro del libro recomiendan esto para saber mas como usar la windows api con c++
http://read.pudn.com/downloads156/ebook/693901/Windows%20via%20C%E3%80%81C%2B%2B,%20Fifth%20Edition.pdf
Todavia no lo he visto pero puede que explican lo que quiero.
Saludos
CitarHola daryo yo para saber si soy administrador hice algo parecido pero yo intento escribir en el registro y si no me devuelve error 5 soy administrador pero esto no es nada ;D A mi no me basta solo con esto quiero mas.
leyendo un poco la msdn
( lo que hace falta tener un buen nivel de ingles :-'(
) y probando algunas cosas con el registro como escribir en el. y al parecer funciona :
#include <iostream>
#include <windows.h>
using namespace std;
int permisosadm();
int main()
{
if(permisosadm()==1)
{
HKEY lol;
SECURITY_INFORMATION asd;
PSECURITY_DESCRIPTOR nw;
DWORD resultado;
RegGetKeySecurity(lol,asd,nw,&resultado);
const char val[]="valor";
RegCreateKeyEx(HKEY_LOCAL_MACHINE,"software\\nuevo",0,NULL,0,KEY_WRITE,NULL,&lol,NULL);
//RegSetValue(lol,"jaja",REG_SZ,"prueba",0);
RegSetValueEx(lol,"prueba",0,REG_SZ,(LPBYTE)val,sizeof(val));
cout << "ya tengo permisos de administrador :D" << endl;
}
else
{
return 0;
}
system("pause");
return 0;
}
int permisosadm()
{
HANDLE archivo;
archivo=CreateFile("C:\\random",GENERIC_READ|GENERIC_WRITE ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(archivo==INVALID_HANDLE_VALUE)
{
CloseHandle(archivo);
TCHAR dir[2045];
GetModuleFileName(NULL,dir,2045);
ShellExecute(NULL,"runas",dir,NULL,NULL,SW_SHOWNORMAL);
return 0;
}
CloseHandle(archivo);
return 1;
}
Me refiria a algo como esto:
int result; RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&clave);
result=RegSetValueEx(clave,"windows",0,REG_SZ,(BYTE *)dir,sizeof(dir));
if(result==5)
cout << "No eres administrador :-(";
mm no lo veo demasiado complicado de adaptar jeje ya pudiendo escribir en HKEY_LOCAL_MACHINE.
tambien puedes usar hkey_current_user\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run asi no necesitaras permisos de admin.
Cita de: patilanz en 15 Junio 2014, 00:01 AM
Hola daryo yo para saber si soy administrador hice algo parecido pero yo intento escribir en el registro y si no me devuelve error 5 soy administrador pero esto no es nada ;D A mi no me basta solo con esto quiero mas.
x64Core encontre el libro parte 1 6 edicion pero son cosas de windows y no hay codigo c/c++ o es esto lo que necesito para entender lo luego en c++?
http://infoman.teikav.edu.gr/~stpapad/WindowsInternalsPart16thEdition.pdf
Parece estar bien y se ve que te explican muchas.
Dentro del libro recomiendan esto para saber mas como usar la windows api con c++
http://read.pudn.com/downloads156/ebook/693901/Windows%20via%20C%E3%80%81C%2B%2B,%20Fifth%20Edition.pdf
Todavia no lo he visto pero puede que explican lo que quiero.
Saludos
Lo que estas buscando es copy-paste? Ese libro te explica como Windows funciona no hay necesitdad de copy-paste.
Cita de: patilanz en 15 Junio 2014, 01:57 AM
Me refiria a algo como esto:
int result; RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&clave);
result=RegSetValueEx(clave,"windows",0,REG_SZ,(BYTE *)dir,sizeof(dir));
if(result==5)
cout << "No eres administrador :-(";
Eso no realmente te dice que eres administrador o no. mejor OpenProcessToken>GetTokenInformation.TokenIsElevated
daryo gracias ahora no me pide permisos de administrador pero no me entere porque en local_machine si y en el otro no?
x64Core no quiero copy/paste y tienes razón. Ahora al pensar lo creo que es mejor leer me el libro y luego al saber como funciona windows con mas detalles ya supongo que lo podre adaptar al c++ y entonces me leere las funciones de la API.
Citardaryo gracias ahora no me pide permisos de administrador pero no me entere porque en local_machine si y en el otro no?
porque key_current_user es solo del usuario no de todo el sistema si inicia desde otro usuario no se va a cargar el programa.