У меня есть следующие конфигурации среды:Вызов Remoting IPC Channel из Powershell Remoting сессии
машина "Target" с моей службой Windows работает под "NT AUTHORITY \ SYSTEM". Эта служба Windows, имеет защищенный порт IPC .NET Remoting открыть следующим образом:
Dictionary<string, object> properties = new Dictionary<string, object>(); properties["authorizedGroup"] = GetUsersGroupName(); // "S-1-5-32-545" SID, setting to "S-1-1-0" gives the same result properties["name"] = configuration.ServiceShortName + ".Server"; properties["portName"] = configuration.ServiceGuid; BinaryServerFormatterSinkProvider sinkProvider = new BinaryServerFormatterSinkProvider(); sinkProvider.TypeFilterLevel = TypeFilterLevel.Full; Channel = new IpcServerChannel(properties, sinkProvider); Channel.IsSecured = true; ChannelServices.RegisterChannel(Channel, true);
«Caller» машина, что с учетной записью домена, прошедших проверку подлинности (ДОМЕН \ Caller) удаленно вызывает локальный (местный на " Target ") приложение (назовем его TargetApp) на "Target" машины через Powershell Remoting (WS-Management):
$session = new-pssession -computerName "$targetHost" Invoke-Command -Session $session -Args $application,$arguments -OutVariable output -scriptblock $scriptBlockRemote Remove-PSSession $session
в TargetApp, который вызывается локально на "машине Target"(в связи с Powershell Remoting вызов от «Caller») должен сделать IPC-вызов клиента на IPC-сервер на та же машина «Target» (что IPC-сервер работает под управлением Windows Service на одной целевой машине)
Любые попытки вызова сервера IPC в этой конфигурации в конечном итоге с:
Не удалось подключиться к порт IPC: доступ запрещен.
Наблюдения:
- Изменение свойств [ "authorizedGroup"] в "Everyone" ("S-1-1-0") во время инициализации канала сервера не помогает, и я получаю ту же ошибку , Тот же результат полностью отключает безопасность на сервере.
Когда "Caller" вызывает TargetApp на машине "Target" я могу ясно видеть, что:
- "C: \ Windows \ system32 \ wsmprovhost.exe -вложения" процесс начался "Target" машина под «Caller» учетные данные пользователя («DOMAIN \ Caller»)
- wsmprovhost.exe на «Target», а затем вызывает метод TargetApp под учетными данными пользователей «Caller» («DOMAIN \ Caller»)
- Когда приложение достигает точки вызова сервер IPC, он не работает
По существу я могу ясно видеть, что powershell вызывает локальный TargetApp на компьютере «Target» под ожидаемыми учетными данными, однако по какой-либо причине вызов IPC завершается неудачно (хотя два процесса - TargetApp, который выполняет вызов клиента IPC и службу Windows, IPC-сервер - находятся на одной машине, вызов IPC не работает)
Magical! Если я перейду непосредственно к машине «Target», запустите «cmd» под учетными данными учетной записи DOMAIN \ Caller и вызовите TargetApp таким образом - вызов IPC завершается успешно!
Я пытался найти решение, и это выглядит как несколько человек были врезаться в это в прошлом, однако не было установлено никаких четких причин/причина/решение.
P.S. После небольшого исследования у меня есть подозрение, что это связанные с аутентификацией, так как Powershell Remoting использует Kerberos по умолчанию, в то время как канал IPC работает только с NTLM: https://msdn.microsoft.com/en-us/library/azure/ms172351(v=vs.85).aspx
Канал IPC всегда использует проверку подлинности NTLM. Kerberos не поддерживается, поскольку IPC ограничивается вызовами внутри одной машины.