Олицетворение WCF не является олицетворением администратора - PullRequest
3 голосов
/ 07 октября 2010

Я пытаюсь использовать WCF для удаленного управления пользователями.Я и повторно использую некоторый код, который был у меня на сервере 2003 и работал нормально, но на моем тестовом окне Windows 7, когда я проверяю, является ли пользователь, вызвавший функцию администратором, он говорит, что это не так.1003 *principal.IsInRole(WindowsBuiltInRole.Administrator) возвращает false каждый раз.И моя текущая личность и принципал.идентичность - правильный пользователь, который будет выдавать себя за другого.и этот пользователь является членом группы администраторов.

Я думаю, что это связано с UAC, который был реализован в Windows Vista и выше.это будет проблемой, потому что производственный компьютер, на котором он будет работать, это win2k8-r2 box.

Есть предложения, что делать?

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Взгляните на эту статью в разделе «Как справиться с Windows Vista», очень хорошо написанную статью о UAC и программной проверке привилегий администратора.

0 голосов
/ 07 октября 2010

Поскольку я не хотел делать всю эту работу (из публикации RandomNoob) для проверки, является ли пользователь администратором, а служба уже работает в административном контексте, я решил просто отказаться от олицетворения.Я создал новую группу пользователей под названием WCFUsers, и любой, кто будет использовать сервис, был добавлен в эту группу.Теперь он выполняет операции System.DirectoryServices.AccountManagement в своем собственном контексте.

[OperationBehavior(Impersonation=ImpersonationOption.NotAllowed)]
public string SetPassword(string username)
{
    WindowsPrincipal principal = new WindowsPrincipal(OperationContext.Current.ServiceSecurityContext.WindowsIdentity);
    if (principal.IsInRole("WCFUsers"))
    {
        try
        {
            lock (Watchdog.m_principalContext)
            {
                using (UserPrincipal up = UserPrincipal.FindByIdentity(Watchdog.m_principalContext, username))
                {
                    string newpassword = CreateRandomPassword();
                    up.SetPassword(newpassword);
                    up.Save();
                    return newpassword;
                }
            }
        }
        catch
        {
            return null;
        }
    }
    else
        return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...