Почему я получаю разные результаты по запросу wmi в WCF удаленно и локально? - PullRequest
3 голосов
/ 01 ноября 2011

Я запрашиваю принтеры через csharp / .net внутри службы WCF.При локальном вызове (т. Е. Клиент запускается с локального компьютера) возвращает один набор принтеров.При удаленном вызове он вызывает другой набор.

Служба wcf настроена на прием и олицетворение с использованием учетных данных, переданных при создании клиента.

Основное различие, которое я заметил черезУдаленная отладка - это тип аутентификации при вызове:

WindowsIdentity.GetCurrent()

. Это Kerberos при удаленном вызове и Neogotiate при локальном вызове.

Вот небольшая выборка кода:

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public List<string> GetAvailablePrinters()
    {
        List<string> retval = new List<string>();

        using (ManagementClass printerClass = new ManagementClass("win32_printer"))
        {
            ManagementObjectCollection printers = printerClass.GetInstances();
            foreach (ManagementObject printer in printers)
            {
                if ((bool)printer["Shared"] == true)
                    retval.Add((string)printer["Name"]);
            }
        }

        return retval;
    }

Оба вызова выполняются успешно, однако я получаю правильный список локально, но ничего удаленно.

Здесь есть два аспекта:

Выполнение тестового исполняемого файла на локальном компьютере.сервер:

{System.Security.Principal.WindowsIdentity}
AuthenticationType: "Negotiate"
Groups: {System.Security.Principal.IdentityReferenceCollection}
ImpersonationLevel: Impersonation
IsAnonymous: false
IsAuthenticated: true
IsGuest: false
IsSystem: false
m_authType: null
m_groups: {System.Security.Principal.IdentityReferenceCollection}
m_impersonationLevel: Impersonation
m_isAuthenticated: 1
m_name: null
m_owner: null
m_safeTokenHandle: {Microsoft.Win32.SafeHandles.SafeTokenHandle}
m_user: {xxxxx}
Name: "adomain\\auser"
Owner: {xxxxx}
Token: token number
TokenHandle: {Microsoft.Win32.SafeHandles.SafeTokenHandle}
User: {xxxxxxxx}

Тот же исполняемый файл запускается удаленно

{System.Security.Principal.WindowsIdentity}
AuthenticationType: "Kerberos"
Groups: {System.Security.Principal.IdentityReferenceCollection}
ImpersonationLevel: Impersonation
IsAnonymous: false
IsAuthenticated: true
IsGuest: false
IsSystem: false
m_authType: null
m_groups: {System.Security.Principal.IdentityReferenceCollection}
m_impersonationLevel: Impersonation
m_isAuthenticated: 1
m_name: null
m_owner: null
m_safeTokenHandle: {Microsoft.Win32.SafeHandles.SafeTokenHandle}
m_user: {xxxxx}
Name: "adomain\\auser"
Owner: {differnt owner}
Token: different Token number
TokenHandle: {Microsoft.Win32.SafeHandles.SafeTokenHandle}
User: {xxxxxx}

1 Ответ

2 голосов
/ 01 ноября 2011

Кажется, что принтеры, которые вы пытаетесь перечислить, являются удаленными принтерами для машины, на которой запущена служба WCF.Олицетворение позволяет получить доступ только к локальным ресурсам, доступным на вызываемой машине.Эта хорошая статья MSDN о олицетворении и делегировании в WCF должна помочь вам выбрать правильный путь.Вам либо потребуется реализовать делегирование для отображения списка удаленных ресурсов из службы WCF, либо вообще не использовать делегирование и заставить службу WCF работать под учетной записью домена, которая может выводить список удаленных принтеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...