2015-12-11 1 views
0

У меня есть приложение-служба, которому необходимо получить доступ к кусту реестра пользователя, чтобы получить лицензию, необходимую для запуска приложения из службы. Как мне это сделать?Получить доступ к кусту реестра HKEY_CURRENT_USER другого пользователя, чем текущий

+1

содержание _HKEY_CURRENT_USER_ создается во время входа пользователя (это не постоянные). Если вы хотите, чтобы постоянное значение попыталось получить его из _HKEY_LOCAL_MACHINE_ или _HKEY_USERS \% USER_SID% _. – CristiFati

+0

Почему учетная запись службы не может быть лицензирована для приложения напрямую? –

ответ

0

Вы можете сделать это более чистым способом с необработанными API-вызовами полностью, но если вы являетесь Windows n00b, как я, скорее всего, у вас есть функциональность, подобная классу TRegistry, для доступа к ключам и значениям один раз ты внутри.

Вот небольшой класс расширения для TRegistry я сделал, чтобы получить доступ HKCU другого пользователя:

unit HKCURegistry_; 

interface 
uses Registry, Windows, SysUtils; 

type 
    THKCURegistry = class(TRegistry) 
    private 
     Function Reg_OpenCurrentUser : Integer; 
     Function ImpersonateUser(const User, PW : String) : boolean; 
    public 
     Function OpenUserRegHive(const User, PW : String) : integer; 
     Function Revert : boolean; 
    end; 

implementation 

function THKCURegistry.ImpersonateUser(const User, PW: String): boolean; 
var 
    TokenHandle : THandle; 
begin 
    Result := LogonUser(pChar(User), pChar(''), pChar(PW), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, TokenHandle); 
    if Result then 
    Result := ImpersonateLoggedOnUser(TokenHandle); 
end; 

function THKCURegistry.Reg_OpenCurrentUser: Integer; 
var 
    key : HKEY; 
begin 
    Result := RegOpenCurrentUser(KEY_READ, &key); 
    self.SetCurrentKey(key); 
end; 

function THKCURegistry.OpenUserRegHive(const User, PW: String): integer;  
begin 
    if ImpersonateUser(User, PW) then begin 
    Result := Reg_OpenCurrentUser; 
    end else raise Exception.Create('Unable to log on user ' + User + ' with password ' + PW); 
end; 

function THKCURegistry.Revert: boolean; 
begin 
    Result := RevertToSelf; 
end; 

end. 

Класс наследует TRegistry и не перегружает ни функциональности BaseClass. OpenUserRegHive является родителем плаката класса, он олицетворяет другого пользователя и предоставляет доступ к его/ее узлу реестра HKCU. Возвратный вызов сбрасывает олицетворение, остальное - вес тяги TRegistry.

+1

Откуда вы получите пароль? –

0

Вы можете прочитать из HKEY_USERS \ SID

function GetCurrentUserSID:String; 
var 
    objSWbemLocator : OLEVariant; 
    objWMIService : OLEVariant; 
    objWbemObjectSet: OLEVariant; 
    oEnum   : IEnumvariant; 
    oWmiObject  : OLEVariant; 
    iValue   : LongWord; 
    SDummy   : AnsiString; 
Begin 
    objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    objWMIService := objSWbemLocator.ConnectServer('localhost','root\cimv2', '',''); 
    objWbemObjectSet:= objWMIService.ExecQuery('SELECT * FROM Win32_Account','WQL',0); 
    oEnum   := IUnknown(objWbemObjectSet._NewEnum) as IEnumVariant; 
    {'Name','Domain','SID', Status} 
    while oEnum.Next(1, oWmiObject, iValue) = 0 do 
    begin 
     SDummy:=VarStrNull(oWmiObject.Properties_.Item('SID').Value); 
     //SDummy:= SDummy + VarStrNull(oWmiObject.Properties_.Item('Domain').Value); 
     //SDummy:= SDummy + VarStrNull(oWmiObject.Properties_.Item('Status').Value); 
     oWmiObject:=Unassigned; 
    end; 
    Result:= SDummy; 
End; 
+1

Пожалуйста, объясните свой код немного, чтобы мы могли понять вашу логику. – Shawn

Смежные вопросы