![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HKLM под Windows Vista (Build 5308)
Nostradamus © (2006-03-06 03:51:00)Почему-то под Windows Vista Build 5308 не создаются Ключи в рееестре в HKEY_LOCAL_MACHINE\Software
Не подскажете ли в чём проблема. Может быть для этого нужно иметь какие-то особые права?
Использую TRegistry.
Registry rights tester (2006-03-09 23:51:00) [1]Вот такой код работает под Vista 5270 из-под встроенной учетной записи администратора без дополнительных ухищрений:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TRegistry.Create(KEY_READ or KEY_WRITE) do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('\Software\RightsTest', true) then
WriteString ('CanIWrite', 'Yes');
finally
Free;
end;
end;
Nostradamus (2006-03-09 23:28:00) [2]
> fellix (09.03.06 16:56) [40]
>
> Увы, в общем случае, это - не решение.
> Ну не заставлять же каждого покупателя программы снижать
> глобальную security. Стоило бы разобраться, как получает
> права regedit. Возможно в Висте можно прописывать права
> отдельным программам...
>
Обязательно постараюсь узнать. Если удастся что-то выяснить, то напишу в форум...
Crash Coredump (2006-03-09 18:45:00) [3]
> Стоило бы разобраться, как получает права regedit.
Рискну предположить, что по цифровой подписи.
Eraser (2006-03-09 18:38:00) [4]
> fellix (09.03.06 16:56) [40]
исправят... imho
на то она и бета.
fellix (2006-03-09 16:56:00) [5]Увы, в общем случае, это - не решение.
Ну не заставлять же каждого покупателя программы снижать глобальную security. Стоило бы разобраться, как получает права regedit. Возможно в Висте можно прописывать права отдельным программам...
Nostradamus (2006-03-09 16:26:00) [6]Ха, получилось.
Нужно было в
Administrative Tools -> Security Configuration Manager -> Local Policies -> Security Options
поставить опцию:
User Account Control: Run all users, including administrators, as standart users
в
Disabled
Ещё раз, всем спасибо за помощь, особенно fellix
Nostradamus (2006-03-09 15:29:00) [7]> fellix (09.03.06 15:23) [37]
С удовольствием поэксеперементирую.
П.С. Большое спасибо за помощь
fellix (2006-03-09 15:23:00) [8]
> Nostradamus (09.03.06 15:01) [36]
Тогда давайте экспериментировать.
1. Работаем под админом.
2. Убеждаемся, что под ХР "программа записи в реестр" работает правильно.
3. Под Вистой в Administrative Tools -> Local Security Policy -> Local Policies -> User Rights Assignment (или чего-нить подобное) прописываем админу все привилегии.
4. Для надежности перегружаемся.
5. Проверяем привилегии через код из [34]; запускаем "программу записи в реестр"; смотрим результаты и т.п.
Nostradamus (2006-03-09 15:01:00) [9]> fellix (09.03.06 14:50) [34]
под XP - CHECKED OK
под Vista - CHECKED NO
fellix (2006-03-09 14:50:00) [10]> Nostradamus
В [28] что-то неправильно. Проверьте так:
var hTkn: THandle;
newPriv,
oldPriv: _TOKEN_PRIVILEGES;
retLen: DWORD;
qryPriv: _PRIVILEGE_SET;
Value: BOOL;
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hTkn)
then begin
with newPriv do begin
PrivilegeCount := 1;
if LookupPrivilegeValue(nil, 'SeBackupPrivilege', Privileges[0].Luid)
then begin
Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hTkn, FALSE, newPriv, SizeOf(newPriv), oldPriv, retLen)
then MessageBox(0, 'Adjusted', '', 0);
// else error
end; // else error
end; // else error
with qryPriv do begin
PrivilegeCount := 1;
Control := 0;
if LookupPrivilegeValue(nil, 'SeBackupPrivilege', Privilege[0].Luid)
then begin
if PrivilegeCheck(hTkn, qryPriv, Value)
then if Value
then MessageBox(0, 'Checked OK', '', 0)
else MessageBox(0, 'Checked NO', '', 0);
// else error
end; // else error
end; // else error
CloseHandle(hTkn);
end; // else error
end;
Второй "with...begin" - проверка, что привилегия таки получена (из опыта: предоставляется не всегда).
Nostradamus (2006-03-09 14:50:00) [11]Ну что ж, будем ждать пока появится :)
Crash Coredump (2006-03-09 14:22:00) [12]Nostradamus (09.03.06 13:53) [32]
Скорее, больше ни у кого нет Vista 5308
Nostradamus (2006-03-09 13:53:00) [13]
> n0name (09.03.06 08:36) [29]
>
> а закрыть?
>
Что закрыть?
Я так понимаю, что больше ни у кого идей нет :(
DelphiN! (2006-03-09 09:48:00) [14]Получается под Виста большинство имеющихся программ работать не будут, жаль ...
DelphiN! (2006-03-09 09:48:00) [15]Хотя может еще и пофиксят
n0name (2006-03-09 08:36:00) [16]а закрыть?
Nostradamus (2006-03-09 03:02:00) [17]Пробую вот так, всё равно не работает - Access Denied :(
var
hToken : Cardinal;
tp : _TOKEN_PRIVILEGES;
rs : Cardinal;
begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue(nil, 'SeBackupPrivilege', tp.Privileges[0].LUID);
AdjustTokenPrivileges(hToken, False, tp, 0, nil, rs);
LookupPrivilegeValue(nil, 'SeRestorePrivilege', tp.Privileges[0].LUID);
AdjustTokenPrivileges(hToken, False, tp, 0, nil, rs);
end;
Nostradamus (2006-03-09 00:22:00) [18]Спасибо, попробую
fellix (2006-03-08 20:50:00) [19]Ну так надо получить.
MSDN:
SeBackupPrivilege - This privilege is required by the RegSaveKey and RegSaveKeyEx functions.
SeRestorePrivilege - This privilege is required by the RegLoadKey function.
Nostradamus (2006-03-08 19:08:00) [20]SeBackupPrivilege - Disabled
SeRestorePrivilege - Disabled