Консультация № 186688
08.10.2012, 07:11
107.62 руб.
0 0 0
Здравствуйте Уважаемые!

Есть WCF сервер, который хостится в службе Windows. Служба запущена от имени LocalSystem.
В WCF выполняется процедура, которая обращается по WMI к сетевым компьютерам и записывает статистику в базу данных через Entity Framework.
Клиентское приложение выполняется от имени администратора домена. Необходимо чтобы запросы к сетевым компьютерам происходили от имени того кто запустил клиентское приложение.
Но тут проблемка... Вроде бы олицетворение происходит, потому что соединение с базой устанавливается успешно (SQLEXPRESS с windows аутентификацией) да и в ServiceSecurityContext.Current.WindowsIdentity.Name лежит правильное имя. Но при соединении по WMI с любым компом в домене получаю Access Denied.

Немного кода:

Это в клиенте:
[CSHARP]
MyServer.MyClient svc = new MyServer.MyClient();
svc.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
svc.ScanWS(WSID);
[/CSHARP]

Это в службе Windows:
[CSHARP]
WSHttpBinding bind = new WSHttpBinding(SecurityMode.Message,false);
bind.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
Type serviceType = typeof(MyService);
Uri serviceUri = new Uri("http://localhost:8080/");
host = new ServiceHost(serviceType, serviceUri);
host.AddServiceEndpoint(typeof(IMyService), bind, serviceUri);
host.Open();
[/CSHARP]

Это в WCF службе:
[CSHARP]
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public bool ScanWS(string WSID)
{
try
{
//Если здесь запросить ServiceSecurityContext.Current.WindowsIdentity.Name то можно увидеть имя пользователя который запустил клиентское приложение
MyDBEntities db = new MyDBEntities();
System.Data.Objects.ObjectQuery<Workstation> ws = db.Workstations.Where("it.WSID=@wsid", new System.Data.Objects.ObjectParameter("wsid", Convert.ToInt32(WSID)));
string WSName = ws.First().WSName;
string spath = "\\\" + WSName + "\\root\\cimv2";
ManagementPath path = new ManagementPath(spath);
ManagementScope scope = new ManagementScope(path);
scope.Options.Impersonation = ImpersonationLevel.Impersonate;
scope.Connect(); //- вот здесь Отказано в доступе
//......
}
catch
{
}
}
[/CSHARP]

Так вот непонятно куда копать, в чем причина отказа в доступе? Может быть на рабочей станции как-то можно посмотреть? Просмотр логов WMI на тех машинах, к которым соединяюсь ничего не дал, не вижу я там даже от какого имени была попытка соединиться....

Друзья, натолкните на мысль. Заранее спасибо.

Обсуждение

Форма ответа