Речь идет о знаменитом ограничении двойного прыжка, которое выглядит тривиальным и имеет как минимум 10 обходных путей, но я не могу найти даже такое, которое подходит для моей настройки.
Вот мое окружение: у меня ~ 50 виртуальных машин в Windows 10, каждая виртуальная машина работает на отдельном оборудовании - мы используем виртуальные машины, потому что наши ИТ-специалисты утверждают, что их проще поддерживать, а физические, мне лично не нравятся виртуальные машины, но это не так то, что зависит от меня.
Мы находимся в не доменной среде, Active Directory нет, мы используем рабочую группу, и каждый компьютер администрируется индивидуально.
Моя цель - оптимизировать управление ПК, например, установку программного обеспечения, регистрацию / запуск служб и т. Д. Мне нужно сделать это на всех компьютерах одновременно, чтобы не выполнять каждую задачу 50 раз. Мне удалось относительно быстро запустить PowerShell Remote, но очень скоро я застрял на невозможности доступа к любому сетевому ресурсу, требующему дополнительной аутентификации (все наши сетевые ресурсы требуют аутентификации LDAP).
То, что я пробовал до сих пор.
Повторная аутентификация из сеанса, описанного здесь :
$mappedDrive = @{
Name = "u"
PSProvider = "FileSystem"
Root = "\\bladefs\share2"
Credential = 'svetlozar.draganov'
}
Invoke-Command -ComputerName bw33 -ScriptBlock {
New-PSDrive @using:mappedDrive
Get-Content -Path \\bladefs\share2\text.txt
Get-PSDrive
Remove-PSDrive -Name "u"
Get-PSDrive
} -Credential render
То, что делает вышеупомянутая команда, - это запуск удаленной команды через Invoke-Command
, которая запрашивает две аутентификации, первая аутентификация - это подключение к машине bw33, затем с помощью команды New-PSDrive
другая аутентификация отправляется в уже установленную сессию с bw33 для монтирования общего сетевого ресурса с именем пользователя и паролем. Это иногда в очень редких случаях действительно работает, но я не могу точно определить, когда и почему это работает и почему в большинстве случаев не работает. Несмотря на то, что я выполняю абсолютно один и тот же сценарий PowerShell десятки раз, он работает только для очень небольшого процента из них, для остальных он просто говорит следующее:
A specified logon session does not exist. It may already have been
terminated
+ CategoryInfo : InvalidOperation: (u:PSDriveInfo) [New-PSDrive], Win32Exception
+ FullyQualifiedErrorId : CouldNotMapNetworkDrive,Microsoft.PowerShell.Commands.NewPSDriveCommand
+ PSComputerName : bw33
Cannot find path '\\bladefs\share2\text.txt' because it does not exist.
+ CategoryInfo : ObjectNotFound: (\\bladefs\share2\text.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
+ PSComputerName : bw33
Я на самом деле запечатлел работающую и нерабочую попытку на видео ниже:
https://drive.google.com/uc?id=1HYD8p-VkLYyIExZVWO_8qgpI2kmlUDgF
Как вы можете видеть при первом выполнении, все в порядке. PSDrive успешно сопоставлен, и я могу достичь сетевого пути \ bladefs \ share2, но при втором выполнении я получил некоторые ошибки.
Аналогично приведенному выше, но вместо сопоставления диска с помощью команды PSDrive сопоставление его с помощью команды NET USE с именем пользователя и паролем.
Invoke-Command -ComputerName bw33 -Credential render -ScriptBlock {
net use x: \\bladefs\share2 /user:svetlozar.draganov password
Test-Path \\bladefs\share2
}
Это, как и первое, иногда работает, но опять же, это работает только один раз, все последующее выполнение приводит к этой ошибке:
System error 1312 has occurred.
+ CategoryInfo : NotSpecified: (System error 1312 has occurred.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName : bw33
A specified logon session does not exist. It may already have been terminated.
Вот видео еще одной попытки, которая снова фиксирует выполнение и нерабочее выполнение этой команды:
https://drive.google.com/uc?id=1wP20sbmXMfWu4dvjsdF8REDWgNxiKAS-
Использование CredSSP, описанного здесь :
$session = New-PSSession -cn bw33 -Credential render -Authentication Credssp
Invoke-Command -Session $session -ScriptBlock {Test-Path \\bladefs\share2}
Хотя это самый популярный и небезопасный способ решения этой проблемы, я решил попробовать, потому что рекомендуемые опции не работают. К сожалению, я тоже попал в тупик с этим подходом, вот ошибки:
New-PSSession : [bw33] Connecting to remote server bw33 failed with
the following error message : The request is not supported. For more
information, see the about_Remote_Troubleshooting Help topic.
At line:1 char:12
+ $session = New-PSSession -cn bw33 -Credential render -Authentication ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : 50,PSSessionOpenFailed
Invoke-Command : Cannot validate argument on parameter 'Session'. The
argument is null or empty. Provide an argument that is not null or empty,
and then try the command again.
At line:2 char:25
+ Invoke-Command -Session $session -ScriptBlock {Test-Path \\bladefs\sh ...
+ ~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand
и соответственно видео:
https://drive.google.com/uc?id=10tbAq6vvRsvT-1SGqOzvPgIPcM-MT8CJ