Опредления наличия прав админа

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 24 Feb 2011.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Подскажите нормальную возможность определения наличия прав админа. Особенности
    1) консоль не парсить
    2) поддержка винды разного языка
    3) не использовать WMI и прочие хрени.
    4) совместимость с Win7

    Была идея - создавать файл в папке Windows. Если создался, то значит есть права админа. Но на Win7 из-за UAC всё обламывается.
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    443
    Reputations:
    288
    можно сделать так как ты предложил,ток отключать uac?(или прятать окно)отключать если юзверу дозволено копатся в реестре...
     
    #2 DooD, 24 Feb 2011
    Last edited: 24 Feb 2011
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 DooD ты гений. Если у человека нет прав админа то отключить UAC - это вообще заоблочное желание.
    А чтобы спрятать окно UAC нужно попасть на защищенный рабочий стол (где оно и показывается), а для этого надо иметь права System и ему подобные.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    О. Нашел фишку. Оказывается всё через Net функции можно сделать. т.е.
    Кому интересно то делается это так:


    Code:
    	LPUSER_INFO_1	UserInfo;
    	WCHAR		UserName[250];
    	DWORD		UserNameLen = 250;
    
    	if (GetUserNameW(UserName, &UserNameLen) &&
    		NetUserGetInfo(NULL, UserName, 1, (LPBYTE*)&UserInfo) == NERR_Success &&
    		(UserInfo->usri1_priv & USER_PRIV_ADMIN))
    	{
    		MessageBoxA(0, "admin", "admin", MB_OK);
    	}
    
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    443
    Reputations:
    288
    Ты предпологаешь что в учетке дозволены минимальные действия?
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ты это о чем вообще?
    Я вообще предполагаю что если у человека есть права админа, то можно делать определенное действие. Если прав админа нет, действовать по другому и предложить связаться с администратором для установки программы
     
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    443
    Reputations:
    288
    А,я думал тебе надо все это проверить так чтоб uac не вылазило...я думал сначала втупую определять класс окна и делать SW_HIDE,но я так понял что не выйдет:)
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 DooD UAC сделан так что окно появляется на рабочем столе созданном системным процессом + наложена кое какая защита. В частности:
    1) Окно нельзя найти из под своего пользователя
    2) поиск окна по координатам мыши толком ничего не даст. потому что его хендл нельзя использовать.
    3) эмуляция нажатия на клавишу + эмуляция нажатия на кнопку мышки - не катит. т.е. окно не воспринимает это.
    4) посылка WM сообщения окну, тоже проваливается из-за того что окно принадлежит другому пользователю.
    5) тупо скрыть окно нельзя, даже потому что поток который затребовал повышения прав автоматически блокируется до появления решения от UAC


    Тот метод что я привел пашет отлично. только что протестировал на:
    1) Win XP SP 2 RU (англ + русские имена пользователей)
    2) Win XP SP 3 Eng (англ + русские имена пользователей)
    3) Win 7 RU (англ + русские имена пользователей)

    Везде отлично работает и нормально показывает права и без показывания окошка UAC. Ещё бы проверить при доменной системе.
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    443
    Reputations:
    288
    Угу,понятно...на висте не тестил?(уац вроде ж с нее пошел)хотя смысл :):)...
     
  10. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Если в понедельник поеду на работу то смогу проверить.
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 gold-goblin ок. спс. просто необходимо очень знать как себя поведет этот метод на доменной системе. т.к. если залогинелся под доменным именем, то и спрашивать надо не локально а у сервера с AD (хотя могу и ошибаться)
     
  12. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Насколько я понимаю работу домена то на комп при логине передаются его права. Наверно сработает.
     
  13. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    ещё вариантов:
    1) получить свой сид, сделать компаресид с администраторской группой
    2) попробовать себе adjusttokenprivileges
     
  14. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    function IsNTAdmin(dwReserved: dword; var lpdwReserved : dword): BOOL; external 'advpack.dll' name 'IsNTAdmin';
     
    1 person likes this.
  15. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    спс. в принципе норм за исключением того, что это недокументированная функция) но вроде как на висте ей нет.

    Также можно тогда заюзать и IsUserAnAdmin которая есть в висте, но в MSDN сказано что дальше функция может быть убрана.
    А NetUserGetInfo какраз обладает очень хорошей совместимостью