Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2007, 15:13   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию проблемы винды, учётки и выключение

Есть несколько вопросов

1) Как программно узнать под кем запущена прога под админом, или под ограниченной учёткой, я догадываюсь что с помощью AccCtrl и AclAPI, но как именно, наверно что-то через trustee, а то дельфовская справка не очень помогает разобраться в этой теме?

2) При входе в нулевое кольцо с помощью библиотеки от МС-РЭМа путём как колгейта, так и двайвера комп аварийно перезагружается, отчего могут быть такие приколы если версия винды второй экспишный сервис пак профешнал

3) После аварийной перезагрузки компа не стартовала на автозапуске моя прога, потому что наивно ждала сообщения WM_QUERYENDSESSION от системы, чтобы записаться на автозапуск, вообще как можно пережить аварийную перезагрузку компа c помощью переписки с системой, или придёться скрывать ключ в реестре путём перехвата NtEnumerateKey

4) С какими параметрами или привилегиями помимо SeShutdownPrivilege нужно запускать ExitWindowsEx чтобы она выключала комп, на котором есть много учёток, а то или высвечивает сообщение о том что компьютер используется другими пользователями, или с EWX_FORCE выходит в меню выбора учётки

5) простите за мутность вопроса :-)
Изначально у меня на компе была только учётка админа, но потом я создал учётку с ограниченными правами, чтобы практиковаться в почти школьных условиях, а на админку поставил пароль, причём чтобы создать учётку с ограниченными правами мне пришлось создавать ещё одну админскую и удалять поскольку изначальный админский аккаунт система за админку не считала и говорила, что на системе должна быть хоть одна админка, чтобы создать ограниченную (короче весело винда глючит), удалять вторую админку мне пришлось из администрирования, а не из менеджера учёток
Сама хрень в том, что толка мне от пароля на админке нет никакого потому что при включении винда спокойно заходит в неё без вызова логонскрина, это потом если за компом долго не работаешь, приходиться вводить пароль чтобы к себе попасть, как сделать так чтобы пароль на входе всё-таки спрашивался
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 15.10.2007, 19:36   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

1)функция NetUserGetInfo, структуры USER_INFO_1, USER_INFO_11,USER_INFO_3
2) мне самому интересно
3) только скрывать ключ через перехват NtEnumerateKey, защититься от аварийного завершения нельзя!
5) в реестре HKLM\Software\microsoft\Windows NT\CurentVersion\Winlogon, посмотри нет ли там параметров AutoAdminLogon, DefaultUserName, DefaultPassword

Последний раз редактировалось rpy3uH; 15.10.2007 в 19:43.
rpy3uH вне форума Ответить с цитированием
Старый 16.10.2007, 14:20   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

спасибо за ответ

при аварийном выключении всё вырубается без всяких сообщений, насколько я понял, или можно как-нибудь обработать WM_ENDSESSION?

чтобы избавиться от автостарта под админом параметры в реестре надо обнулить или удалить (AutoAdminLogon)?

А что на счёт 4-ого вопроса?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 16.10.2007, 18:41   #4
Skiff
 
Регистрация: 12.10.2007
Сообщений: 3
По умолчанию

На счёт 4-го вопроса:
У MS-Rem'a приводится пример мгновенного выключения компьютера (аналога reset)
Skiff вне форума Ответить с цитированием
Старый 16.10.2007, 19:01   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
при аварийном выключении всё вырубается без всяких сообщений, насколько я понял, или можно как-нибудь обработать WM_ENDSESSION?
ничего не получится, просто комп отключается и всё!!!

Цитата:
Сообщение от joker Посмотреть сообщение
чтобы избавиться от автостарта под админом параметры в реестре надо обнулить или удалить (AutoAdminLogon)?
хочешь обнуляй, хочешь удаляй
rpy3uH вне форума Ответить с цитированием
Старый 17.10.2007, 14:15   #6
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Получаеться, чтобы прога гарантированно перезапустилась, нужно всё-таки, чтобы ключ висел в реестре всегда
А есть ли альтернативные способы автозапуска помимо реестра, процесса-службы и AppInit_DLLs?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 17.10.2007, 17:01   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Да хоть отбавляй! Так, навскидку:

CurrentVersion\Winlogon\Notify
CurrentVersion\Winlogon\Userinit
CurrentVersion\RunServices
CurrentVersion\RunServicesOnce
CurrentVersion\RunOnce

HKLM\Software\CLASSES\exefile\shell \open\command
win.ini ещё никто не отменял load=... (или run=... не помню)
расширение оболочки (shell extehsion) для контекстного меню (файл выполнится по первому правому клику)
...

---

а вот ещё

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell

system.ini:
[boot]
Shell=Explorer.exe number2.exe

Заставить винду читать старый-добрый autoexec.bat
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
ParseAutoexec=1

----

!!! малоизвестное:
HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows\CurrentVersion\RunOnceEx \000x
Создаем строковую переменную со значением программы которую надо запустить, но в интересном формате:
"DLL|Function|Arguments" или "||command parameters"
То есть у нас есть два варианта: мы можем запустить некоторую функцию Function или exe-шник.
Например:
"my_secret_pogram"="||my_secret_pog ram.exe" - запустит my_secret_pogram.exe
"msprint2.dll|RUNDLL_PrintTestPage| " - печать пробной страницы
(с) копьёсправа xakep.ru

Если кинуть прогу в корень диска С и переименовать в Explorer.exe, то она запустится до старта настоящего эксплорера - не проверял
пыщь

Последний раз редактировалось JTG; 17.10.2007 в 17:33.
JTG вне форума Ответить с цитированием
Старый 26.10.2007, 17:08   #8
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
Есть несколько вопросов

1) Как программно узнать под кем запущена прога под админом, или под ограниченной учёткой, я догадываюсь что с помощью AccCtrl и AclAPI, но как именно, наверно что-то через trustee, а то дельфовская справка не очень помогает разобраться в этой теме?
1. Получить маркер доступа процесса или потока (в случае имперсонации) - OpenProcessToken или OpenThreadToken
2. Получить из маркера список групп - GetTokenInformation
3. Создать SID соответствующий учетной записи группы администраторов - AllocateAndInitializeSid
4. Пройтись в цикле по всем группам из токена и с помощью EqualSid сравнить их с Sid из п.3. Если хотя бы один совпал - значит админ
5. Освободить ресурсы - CloseHandle(Token), FreeSid

Вот собственно код:

Код:
const
 SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
 SECURITY_BUILTIN_DOMAIN_RID  = ($00000020);

 DOMAIN_ALIAS_RID_ADMINS           = ($00000220);

 DOMAIN_ALIAS_RID_USERS            = ($00000221);

 DOMAIN_ALIAS_RID_GUESTS           = ($00000222);

function IsAdministrator: Boolean;
var
 psidAdmin: Pointer;
 Token: THandle;
 Count: DWORD;
 TokenInfo: PTokenGroups;
 HaveToken: Boolean;
 I: Integer;
begin
 Result := False;
 psidAdmin := nil;
 TokenInfo := nil;
 HaveToken := False;
 try
   HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
   if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
     HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);
   if HaveToken then
   begin
     {$IFDEF FPC}
     Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
       SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
       psidAdmin));
     if GetTokenInformation(Token, TokenGroups, nil, 0, @Count) or
      (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
        RaiseLastOSError;
     TokenInfo := PTokenGroups(AllocMem(Count));
     Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, @Count));
     {$ELSE FPC}
     Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
       SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
       psidAdmin));
     if GetTokenInformation(Token, TokenGroups, nil, 0, Count) or
      (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
        RaiseLastOSError;
     TokenInfo := PTokenGroups(AllocMem(Count));
     Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, Count));
     {$ENDIF FPC}
     for I := 0 to TokenInfo^.GroupCount - 1 do
     begin
       {$RANGECHECKS OFF} // Groups is an array [0..0] of TSIDAndAttributes, ignore ERangeError
       Result := EqualSid(psidAdmin, TokenInfo^.Groups[I].Sid);
       {$IFDEF RANGECHECKS_ON}
       {$RANGECHECKS ON}
       {$ENDIF RANGECHECKS_ON}
       if Result then
         Break;
     end;
   end;
 finally
   if TokenInfo <> nil then
     FreeMem(TokenInfo);
   if HaveToken then
     CloseHandle(Token);
   if psidAdmin <> nil then
     FreeSid(psidAdmin);
 end;
end;

Последний раз редактировалось rpy3uH; 28.10.2007 в 10:29.
Slovinsky вне форума Ответить с цитированием
Старый 26.10.2007, 17:25   #9
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Мощно, я правда ничё не догнал, может когда-нибудь дорублюсь, а пока возник вопрос о директиве {$IFDEF XXXX} {$ELSE} {$ENDIF XXXX}
как это работает и с какими параметрами можно использовать?
я до этого такое видел только в борландовских модулях как определитель платформы - LINUX или Windows.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 26.10.2007, 17:32   #10
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Не заморачивайтесь. Вообще это директивы условной компиляции. Код, помещенный между ними, компилируется при выполнении того или иного условия, которое вы также можете сами определить с помощью директивы $DEFINE или $UNDEF. Вообще в справке это все есть, не стесняйтесь заглядывать. Лишнее в коде в принципе повыкидывайте, либо можете поупражняться и написать сами, к тому же это не сложно, да я вам написал порядок действий. Всю необходимую теорию берите здесь + MSDN
http://www.delphikingdom.com/asp/vie...catalogid=1322
Slovinsky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выключение компьютера aesoem Общие вопросы Delphi 2 03.07.2008 16:50
Выключение и перезагрузка Патрон Win Api 8 26.03.2008 16:24
Выключение компютера Rahim1993 Win Api 3 03.02.2008 11:23
выключение компьютера Svop Общие вопросы Delphi 23 18.12.2006 22:57