Почему мне отказывают в доступе с помощью Invoke-Command на локальном хосте?

У меня есть действительные учетные данные учетной записи службы 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 можно автоматизировать задачи резервного копирования и восстановления данных.


2
51
2

Ответы:

Решено

То, что вы испытываете, — это проблема двойного прыжка. Вы запускаете удаленную команду и пытаетесь выполнить еще один переход к другой удаленной системе. Несмотря на то, что это ваша локальная система, это все равно удаленный сеанс и, следовательно, имеет те же ограничения. Вы можете подтвердить это, используя пример удаленного хоста с третьим удаленным местоположением.

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\'}