У меня есть два компьютера: A и B. Я пытаюсь автоматизировать некоторые задачи CI\CD, и моя задача состоит в том, чтобы запустить какой-то процесс на B удаленно, из A. Сам файл .exe находится на диске R, который является локальный сетевой диск. Итак, я делаю это:
# here $cred has encrypted credentials, but it is off topic...
Invoke-Command -ComputerName B -Credential $cred -ScriptBlock {
R:\WebClient\Platform\UP_110\Proc.exe
}
Так что, очевидно, это будет то же самое, что набрать R:\WebClient\Platform\UP_110\Proc.exe в PowerShell B и нажать Enter.
Теперь проблема в том, что я получаю эту ошибку при запуске вышеуказанного кода на A:
The term 'R:\WebClient\Platform\UP_110\Proc.exe' is not recognized as the name of a cmdlet, function, sc
ript file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is corr
ect and try again.
+ CategoryInfo : ObjectNotFound: (R:\WebClient\Pl...IMS.UP.Host.exe:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
+ PSComputerName : B
Судя по всему, там написано, что такого файла как R:\WebClient\Platform\UP_110\Proc.exe на моем компьютере B нет. Но это неправда. У меня есть:
На самом деле, у меня есть этот диск R и на A, и на B.
Код отлично работает, если я перемещаю .exe в любой каталог на диске C (который для меня является системным диском), но не для R.
Теперь еще забавнее то, что я могу запускать R:\WebClient\Platform\UP_110\Proc.exe на A и B вручную. И это работает.
Итак, в чем проблема, с которой я столкнулся? Спасибо.
@boxdog хорошо, я вижу. Это печально. В любом случае, как мне использовать Copy-Item, если я не могу получить доступ к диску R?
Вы должны иметь доступ к диску R, используя его имя UNC: \\servername\sharename\WebClient\Platform\UP_110\Proc.exe
Возможно, я неправильно понял, но я думал, что вы запускаете Invoke-Command из системы с определенным диском R в систему без него, поэтому вы копируете оттуда перед запуском удаленной команды, которая затем может использовать .exe в удаленной системе. Просто для ясности: путь, который вы указываете в блоке сценария для Invoke-Command, относится к удаленному серверу, а не к тому, который выдает команду, поэтому, если вы думаете, что он должен иметь возможность подключиться к R, потому что он у вас есть локально, это не так. как это устроено.
@boxdog да, спасибо за разъяснение. Похоже, тогда я пойду с UNC





PowerShell Remoting по умолчанию может получить доступ только к тем дискам, которые сопоставлены в системном контексте. Чаще всего это будут буквенные диски на основе подключенного оборудования (будь то USB, SATA, SCSI и т. д.).
Диски, сопоставленные в контексте пользователь, например удаленные диски, не сопоставляются, поскольку полный вход в систему не происходит так же, как при локальном входе. В вашем распоряжении есть два обходных пути:
Используйте путь UNC при доступе к файлам через общий ресурс SMB/CIFS (например, \\server.domain.tld\ShareName\Path\To\Folder\Or\file.ext
Сопоставьте диск в ScriptBlock, переданном Invoke-Command, используя New-PSDrive:
# Single letter drive name
New-PSDrive -Name "R" -PSProvider FileSystem -Root "\\server.domain.tld\ShareName"
Get-ChildItem R:
# More descriptive drive name
New-PSDrive -Name "RemoteDrive" -PSProvider FileSystem -Root "\\server.domain.tld\ShareName"
Get-ChildItem RemoteDrive:
Три вещи, которые следует отметить:
Get-ChildItem в приведенном выше примере показывает, что в списке содержимого новых дисков должны отображаться файлы, которые вы ожидаете увидеть в удаленном каталоге. Это можно опустить, если вы уверены, что это работает для вас.
Кроме того, использование более длинного имени диска является функцией PowerShell и не означает, что вы можете отображать общие папки как диск из Проводника, используя более одного символа.
Вы можете столкнуться с проблемой двойного перехода, пытаясь таким образом сопоставить удаленный диск, если пытаетесь использовать те же учетные данные, которые вы инициировали Invoke-Command. Правильное решение этой проблемы выходит за рамки Stack Overflow, поскольку это является основным архитектурным соображением для Active Directory..
Однако, вы можете обойти это, создав объект учетных данных и передав его New-PSDrive из ScriptBlock или запустив Invoke-Command с -Authentication CredSSP, если ваша организация не блокирует его (многие так делают).
Предположительно, когда вы входите в
RилиA, сопоставляется дискB, но запуск удаленных команд сAнаBне приводит к полному входу в систему, поэтому нет диска. Вы можете использовать командлет Копировать элемент, чтобы сначала скопировать файл на удаленный сервер, или использовать путь UNC, хотя это может иметь проблему с двойной прыжок.