Как включить SeCreateGlobalPrivilege в .NET, не прибегая к P / Invoke или отражению? - PullRequest
4 голосов
/ 03 апреля 2011

Моя привязка WCF net.pipe не работает, когда сервер работает без повышенных прав. Этот блог помог мне найти ответ - http://weblogs.thinktecture.com/cweyer/2007/12/dealing-with-os-privilege-issues-in-wcf-named-pipes-scenarios.html

Итак, я добавил привилегию SeCreateGlobalPrivilege соответствующему пользователю без прав администратора, но теперь мне нужно программно включить эту привилегию в .NET

Теперь в Интернете есть несколько примеров, как это сделать в .NET, но все они по существу переписывают простой C-код в C # с помощью P / Invoke.

Я хочу знать, как это сделать, используя специальные типы систем .NET, такие как ObjectSecurity, Privilege и т. Д., Чтобы мой код не выполнял P / Invoke - пусть системный код сделает это за меня.

Возможно ли это?

Спасибо.

EDIT1

Что заставляет меня думать, что это возможно? Ну, я искал использование API AdjustTokenPrivileges P / Inovke в .NET с помощью Reflector и обнаружил, что есть метод ObjectSecurity.Persist, который в конечном итоге вызывает этот P / Invoke. Далее, у этого ObjectSecurity есть один защищенный конструктор, что означает, что код, не относящийся к MS, может извлечь его из него и вызвать этот метод.

Таким образом, представляется возможным использование безопасного для типов кода .NET (т.е. без отражения).

1 Ответ

5 голосов
/ 04 апреля 2011

Если вы не хотите использовать P / Invoke самостоятельно, вы все равно можете использовать внутренний класс System.Security.AccessControl.Privilege, используя механизмы отражения, например:

    // => privilege = new Privilege("SeCreateGlobalPrivilege");
    Type privilegeType = Type.GetType("System.Security.AccessControl.Privilege");
    object privilege = Activator.CreateInstance(privilegeType, "SeCreateGlobalPrivilege");

    // => privilege.Enable();
    privilegeType.GetMethod("Enable").Invoke(privilege, null);

    // =>  privilege.Revert();
    privilegeType.GetMethod("Revert").Invoke(privilege, null);

Я не уверен, что это действительно лучше, потому что это более или менее хак, не поддерживается и т. Д., Но хорошо, ленивым парням легко: -)

...