Invoke-Command не видит локальные сетевые диски

У меня есть два компьютера: 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 нет. Но это неправда. У меня есть:

Invoke-Command не видит локальные сетевые диски

На самом деле, у меня есть этот диск R и на A, и на B.

Код отлично работает, если я перемещаю .exe в любой каталог на диске C (который для меня является системным диском), но не для R. Теперь еще забавнее то, что я могу запускать R:\WebClient\Platform\UP_110\Proc.exe на A и B вручную. И это работает.

Итак, в чем проблема, с которой я столкнулся? Спасибо.

Предположительно, когда вы входите в R или A, сопоставляется диск B, но запуск удаленных команд с A на B не приводит к полному входу в систему, поэтому нет диска. Вы можете использовать командлет Копировать элемент, чтобы сначала скопировать файл на удаленный сервер, или использовать путь UNC, хотя это может иметь проблему с двойной прыжок.

boxdog 10.05.2022 10:44

@boxdog хорошо, я вижу. Это печально. В любом случае, как мне использовать Copy-Item, если я не могу получить доступ к диску R?

Oleksandr Novik 10.05.2022 11:01

Вы должны иметь доступ к диску R, используя его имя UNC: \\servername\sharename\WebClient\Platform\UP_110\Proc.exe

Theo 10.05.2022 11:29

Возможно, я неправильно понял, но я думал, что вы запускаете Invoke-Command из системы с определенным диском R в систему без него, поэтому вы копируете оттуда перед запуском удаленной команды, которая затем может использовать .exe в удаленной системе. Просто для ясности: путь, который вы указываете в блоке сценария для Invoke-Command, относится к удаленному серверу, а не к тому, который выдает команду, поэтому, если вы думаете, что он должен иметь возможность подключиться к R, потому что он у вас есть локально, это не так. как это устроено.

boxdog 10.05.2022 11:39

@boxdog да, спасибо за разъяснение. Похоже, тогда я пойду с UNC

Oleksandr Novik 10.05.2022 13:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PowerShell Remoting по умолчанию может получить доступ только к тем дискам, которые сопоставлены в системном контексте. Чаще всего это будут буквенные диски на основе подключенного оборудования (будь то USB, SATA, SCSI и т. д.).

Диски, сопоставленные в контексте пользователь, например удаленные диски, не сопоставляются, поскольку полный вход в систему не происходит так же, как при локальном входе. В вашем распоряжении есть два обходных пути:

  1. Используйте путь UNC при доступе к файлам через общий ресурс SMB/CIFS (например, \\server.domain.tld\ShareName\Path\To\Folder\Or\file.ext

  2. Сопоставьте диск в 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, если ваша организация не блокирует его (многие так делают).

Другие вопросы по теме