У меня есть действительные учетные данные учетной записи службы Windows, хранящиеся в $creds
, и я хочу использовать их для доступа к каталогу C:\temp\
на другом сервере под названием remotehost
. Я использую Invoke-Command
для выполнения одного и того же теста дважды: сначала на localhost
(что приводит к отказу в доступе), а затем на remotehost
(что приводит к успеху):
Invoke-Command -ComputerName localhost -Credential $creds -ScriptBlock {
Test-Path -Path \\remotehost\C$\temp\ # access denied
}
Invoke-Command -ComputerName remotehost -Credential $creds -ScriptBlock {
Test-Path -Path \\remotehost\C$\temp\ # True
}
Кто-нибудь может объяснить это «доступ запрещен»? Почему я могу успешно подключиться к remotehost
и выполнить там команду, но не могу выполнить ту же команду напрямую из localhost
?
На всякий случай я также проверил, что соединение с localhost
работает:
Invoke-Command -ComputerName localhost -Credential $creds -ScriptBlock {
Test-Path -Path C:\temp # True
}
🤔 А знаете ли вы, что...
С PowerShell можно автоматизировать задачи резервного копирования и восстановления данных.
То, что вы испытываете, — это проблема двойного прыжка. Вы запускаете удаленную команду и пытаетесь выполнить еще один переход к другой удаленной системе. Несмотря на то, что это ваша локальная система, это все равно удаленный сеанс и, следовательно, имеет те же ограничения. Вы можете подтвердить это, используя пример удаленного хоста с третьим удаленным местоположением.
Invoke-Command -ComputerName remotehost1 -Credential $creds -ScriptBlock {
Test-Path -Path \\remotehost2\C$\temp\
}
Вы также получите сообщение «Доступ запрещен».
Я предполагаю, что этот пример удался, потому что Windows достаточно умна, чтобы знать, что путь UNC на самом деле указывает на локальную систему.
Invoke-Command -ComputerName remotehost1 -Credential $creds -ScriptBlock {
Test-Path -Path \\remotehost1\C$\temp\
}
Почему вы используете сетевой путь внутри ScriptBlock? При использовании Invoke-Command с параметром -ComputerName команда выполняется на удаленном компьютере, поэтому ссылка на \remotehost1\C$\temp\ (сетевой путь) в блоке сценария может не потребоваться. Вместо этого вы можете напрямую использовать локальный путь C:\temp\ в удаленном сеансе.
Invoke-Command -ComputerName remotehost -Credential $creds -ScriptBlock {
Test-Path -Path 'C:\temp\'}