Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

запись в реестр Windows 2K под простым юзером   Найти похожие ветки 

 
serguar   (2004-12-24 15:08) [0]

Здравствуйте.
В форуме уже обсуждалась данная тема(http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988623691&n=15), но приведен пример для чтения. Мне нужна возможность записи. Как это сделать?
Заранее благодарен.


 
Игорь Шевченко ©   (2004-12-24 16:10) [1]


> Мне нужна возможность записи. Как это сделать?


Производить запись под администратором. Или попросить администратора установить права на нужную ветку реестра.


 
serguar   (2004-12-27 07:43) [2]


> Игорь Шевченко

Да я и есть администратор. Программа при старте записывает данные в реестр. Разрабатываю у себя под пользователем с администраторскими правами. Ставлю программу на пользовательский компьютер, завожу обычного пользователя, даю ему пароль. При старте, в момент обращения к реестру программа выдает ошибку.


 
Fay ©   (2004-12-27 07:51) [3]

serguar   (27.12.04 7:43) [2]
Т.е. Вы пытаетесь писать с не очень админскими правами, и Вас удивляют ошибки?


 
serguar   (2004-12-27 07:56) [4]


> Fay

Меня не удивляют ошибки, я хочу узнать как временно из программы получить права администратора, записать в реестр необходимую информацию, а затем оменить права администратора.


 
BiN ©   (2004-12-27 09:14) [5]

serguar   (27.12.04 07:56) [4]

Меня не удивляют ошибки, я хочу узнать как временно из программы получить права администратора, записать в реестр необходимую информацию, а затем оменить права администратора.


Только новый процесс

см. CreateProcessWithLogonW


 
AlexRya   (2004-12-28 10:54) [6]

Совсес не обязательно создавать новый процесс. Достаточно сменить права текущей или новой нити. Такие вещи по-научному зовутся имперсонацией, по этому слову и стоит поискать на MSDN. Также на  wasm.ru есть статья по имперсонации.


 
Плохиш ©   (2004-12-28 11:06) [7]

Если какая-то программа в процессе своей работы попросит меня ввести пароль администратора, то отгадайте с одного раза где она сразу же окажется ;-)

Программа может писать только туда, куда разререшено пользователю, запустившему эту супер-пупер программу.


 
BiN ©   (2004-12-28 11:16) [8]

AlexRya   (28.12.04 10:54) [6]
Совсес не обязательно создавать новый процесс. Достаточно сменить права текущей или новой нити. Такие вещи по-научному зовутся имперсонацией, по этому слову и стоит поискать на MSDN. Также на  wasm.ru есть статья по имперсонации.


Для импесонации нужно иметь или маркер Администратора (ImpersonateLoggedOnUser) или заставить существующий кодовый поток с маркером все того же Администратора подключиться к серверному концу именованного канала. В первом случае маркер можно получить только с помощью LogonUser (все остальные методы типа  DuplicateToken, OpenProcessToken и т.д. отпадают - не хватит прав). Но LogonUser требует включния привилегии SE_TCB_NAME - так что и тут получаем отлуп.

Выкрутасы же с каналами имхо не стоят того.


 
Fay ©   (2004-12-28 19:37) [9]

А нельзя писать в какое-нибудь другое место?


 
AlexRya   (2005-01-01 12:52) [10]

2 Bin:
Все что в итоге нужно для имперсонации - логин и пароль пользователя. А в ImpersonateLoggedOnUser можно передать результат выполнения LogonUser.
Все-таки стоило сходить по тем ссылкам, которые я указывал. В обоих случаях это явно прописано.
А имперсонация через каналы в основном используется для временного ПОНИЖЕНИЯ привилегий системного процесса, который выполняет задачу, полученную от удалённого пользователя (например, редактирование реестра). Хотя ничто не мешает использовать её и для повышения привилегий, но в данном случае это действительно не лучший вариант.

// Плохиш ©   (28.12.04 11:06) [7]

// Если какая-то программа в процессе своей работы попросит меня // ввести пароль администратора, то отгадайте с одного раза где // она сразу же окажется ;-)

На самом деле всё можно сделать по следующей схеме:
При установке программа попросит ввести имя и пароль админа, потом пароль2 для работы с этой программой. Админовские данные зашифровать несимметричным алгоритмом с использованием пароля2. При каждом запуске она будет запрашивать пароль2 и расшифровывать имя и пароль админа для своей работы.
Каждый раз при смене админовских данных придётся сообщать об этом программе.
Если всё сделать правильно, то безопасность системы не пострадает! Главное нигде не хранить админовсие данные в окрытом виде, то есть чтобы их небыло даже в памяти процесса во время его работы (разве что лишь на момент имперсонации).


 
kaZaNoVa ©   (2005-01-01 13:23) [11]

BiN ©   (28.12.04 11:16) [8]

> или заставить существующий кодовый поток с маркером
> все того же Администратора подключиться к серверному
> концу именованного канала

хак винды :)))))))))))))))))


> Выкрутасы же с каналами имхо не стоят того.

я видел такую прогу, но она глючила ..


 
kaZaNoVa ©   (2005-01-01 13:25) [12]

AlexRya   (01.01.05 12:52) [10]

> Главное нигде не хранить админовсие данные в окрытом
> виде, то есть чтобы их небыло даже в памяти процесса
> во время его работы

супер !


 
AlexRya   (2005-01-02 13:43) [13]

kaZaNoVa ©   (01.01.05 13:25) [12]

Что то не так???


 
kaZaNoVa ©   (2005-01-02 19:09) [14]

AlexRya   (02.01.05 13:43) [13]
просто, очень прикольная идея - не хранить в памяти, но имхо трудноосуществляемая %))


 
AlexRya   (2005-01-02 21:50) [15]

Почему?
На момент имперсонации расшифровали логин/пароль, вызвали LogonUser, сразу очистили память со строкой. Винда, начиная с w2k sp2 не хранит имя/пароль в чистом виде. Хотя раньше пароль проксореннй был в winlogon"овской памяти. Так его оттуда вытаскивали все, у кого были привилегии отладки и желание. А сейчас - на хранят! До чего техника дошла, а!
Идея очень даже осуществимая, так как иначе вся безопасность системы летит в <далеко очень>.


 
Плохиш ©   (2005-01-02 22:46) [16]


> AlexRya   (01.01.05 12:52) [10]
> // Плохиш ©   (28.12.04 11:06) [7]
> При установке программа попросит ввести имя и пароль админа,

Вот это хорошо, вот это правильно :-) Это сохранит нам много времени, потому что установка программы будет закончена на этом месте и программа пойдёт в место, угаданное с первого раза :-)


 
AlexRya   (2005-01-02 23:52) [17]

Плохиш ©   (02.01.05 22:46) [16]
Вообще-то я согласен с тобой, но если хочется человеку такую прогу написать!


 
kaZaNoVa ©   (2005-01-03 01:16) [18]

Плохиш ©   (02.01.05 22:46) [16]
ну, зачем так сразу круто ...
я раз прикалывался, с коммандой "run as admin" - зная пороль админа :))
- и запускал проги от его имени, при этом "официально" "Админ" в винду не входил :)))))

//чтобы в логах не светиться лишний раз :)

имхо ..


 
BiN ©   (2005-01-03 18:51) [19]

AlexRya   (01.01.05 12:52) [10]

2 Bin:
Все что в итоге нужно для имперсонации - логин и пароль пользователя. А в ImpersonateLoggedOnUser можно передать результат выполнения LogonUser.
Все-таки стоило сходить по тем ссылкам, которые я указывал. В обоих случаях это явно прописано.


Ну-ну. Я так понимаю, на практике ты это не пробовал делать.

P.S.: Еще раз повторяю: для решения сабжа нужно сделать [1] или [5]


 
AlexRya   (2005-01-04 20:56) [20]

Пробовал! Сомневаешься?

#include <iostream>
#include <stdlib.h>
#include <windows.h>

using namespace std;

typedef BOOL (WINAPI * PCHECK_TOKEN_MEMBERSHIP)(HANDLE, PSID, PBOOL);
PCHECK_TOKEN_MEMBERSHIP CheckTokenMembership;

#ifdef LogonUser
  #undef LogonUser
#endif

typedef BOOL (WINAPI *PLOGON_USER)
(LPTSTR, LPTSTR, LPTSTR, DWORD, DWORD, PHANDLE);
PLOGON_USER LogonUser;

/*++
Routine Description: This routine returns TRUE if the caller"s process is a
member of the Administrators local group. Caller is NOT expected to
be impersonating anyone and is expected to be able to open its own process
and process token.
Arguments: None.
Return Value:
  TRUE - Caller has Administrators local group.
  FALSE - Caller does not have Administrators local group. --
*/
BOOL IsUserAdmin(VOID){
   BOOL b;
   SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
   PSID AdministratorsGroup;
   b = AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &AdministratorsGroup);
   if(b) {
       if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) {
           b = FALSE;
       }
       FreeSid(AdministratorsGroup);
   }
   return(b);
}

BOOL DoImpersonate(){
   HANDLE hToken;
   if (!LogonUser("Администратор", ".", "G1hjnbdjcnjzybt",
                  LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                  &hToken)){
       cout << "LogonUser failed!\n";
       return FALSE;
   }    
   ImpersonateLoggedOnUser(hToken);
}    

int main(int argc, char *argv[])
{
 /* Check on Win2000 or higher */
 OSVERSIONINFO vi = {sizeof(OSVERSIONINFO), 0};
 GetVersionEx(&vi);
 if (vi.dwMajorVersion != 5){
     cout << "Win 2000 or higher NT system required!\n";
     exit(0);
 }
 /* Loading Advapi 32.dll and binding CheckTokenMembership  */
 HINSTANCE hLib = LoadLibrary("advapi32.dll");
 if (!hLib){
     cout << "ERROR: Сan"t load advapi32.dll\n";
     exit(GetLastError());
 }
 CheckTokenMembership =
     (PCHECK_TOKEN_MEMBERSHIP)GetProcAddress(hLib, "CheckTokenMembership");
 if (!CheckTokenMembership){
     cout << "ERROR: Can"t bind CheckTokenMembership function\n";
     exit(GetLastError());
 }
 LogonUser = (PLOGON_USER)GetProcAddress(hLib, "LogonUserA");
 if (!LogonUser){
     cout << "ERROR: Can"t bind LogonUser function\n";
     exit(GetLastError());
 }
 
 if (IsUserAdmin())
    cout << "You already admin!\n";
 else{
    DoImpersonate();
 }    
 system("PAUSE");
 return 0;
}


Ничего такого осбенного!


 
AlexRya   (2005-01-04 20:58) [21]

Да, для особо ушлых - пароль не настоящий!


 
Soft ©   (2005-01-05 05:23) [22]

>serguar   (24.12.04 15:08)  

А чем тебе не нравится ветка реестра HKEY_CURRENT_USER ? Можно писать без прав администратора.


 
BiN ©   (2005-01-06 09:53) [23]

AlexRya   (04.01.05 20:56) [20]

Пробовал! Сомневаешься?
....
Ничего такого осбенного!


Конечно, ничего особенного. Никто и не говорил, что реализация будет сложная. Вот только твой код ни коим образом не решает поставленную задачу, ибо:

1) В W2k функция LogonUser требует наличие привилегии SE_TCB_NAME, а у нас же есть только права обычного пользователя (см. serguar   (27.12.04 07:56) [4]).
2) На кой ляд в примере, на-половину стянутого с MSDN, происходит имперсонация текущего потока лишь в том случае, если поток уже исполняется с правами группы администраторов.

Итак, всё для того же W2k: если в системе отключена служба RunAs и отсутствует другая подобная служба, реализующая создание нового процесса по некоему клиентскому запросу, то невозможно без наличия привилегии SE_TCB_NAME реализовать сабж. И хотя в XP картина несколько иная (сняты вышеуказанные ограничения), грамотнее всего будет сделать как посоветовал Soft ©   (05.01.05 05:23) [22].



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.039 c
1-1107840892
hgd
2005-02-08 08:34
2005.02.20
Сохранение bitmap в jpeg


6-1102174721
Linker
2004-12-04 18:38
2005.02.20
TAPI


1-1107390335
RamZeS
2005-02-03 03:25
2005.02.20
Как возвратить TStrings из dll?


3-1106350319
alexproger
2005-01-22 02:31
2005.02.20
ADOConnection.DataSetCount - всегда 0????


3-1106127644
colci
2005-01-19 12:40
2005.02.20
Помогите с SQL запросом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский