2

Я использую PowerShell, чтобы проверить, открыты ли какие-либо порты на моих компьютерах. У меня есть восемь компьютеров с Windows Server 2008 R2 и я запускаю следующий скрипт:

$localhost = get-content env:computername

foreach($port in get-content "\\computer1\txtfiles\ports.txt")
{

    foreach ($hostname in get-content "\\compiuter1\txtfiles\servers.txt")
    {
        try
        {
            $sock = new-object System.Net.Sockets.Socket -ArgumentList $([System.Net.Sockets.AddressFamily]::InterNetwork),$([System.Net.Sockets.SocketType]::Stream),$([System.Net.Sockets.ProtocolType]::Tcp)
            $sock.Connect($hostname,$Port)
            $output = $localhost+","+$hostname+","+$port+","+$sock.Connected
            $output
            $sock.Close()
        }
        catch {
            $output = $localhost+","+$hostname+","+$port+","+$sock.Connected
            $output
        }
    }
}

Я запускаю этот скрипт на восьми компьютерах с компьютера1, используя:

Invoke-Command -ComputerName computer1,computer2 -FilePath F:\scripts\port-test.ps1

На первом компьютере (computer1 - машина, с которой я выполняю скрипт) я получаю вывод, но на computer2 я получаю:

Cannot find path '\\computer1\txtfiles' because it does not exist.
+ CategoryInfo          : ObjectNotFound: (\\computer1\txt
files:String) [Set-Location], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLo
cationCommand

Почему PowerShell не видит сетевой ресурс? Как я могу это исправить?

1 ответ1

3

Мое лучшее предположение состоит в том, что причина этого - неудачный мульти-прыжок Kerberos.

Я предполагаю, что здесь происходит то, что computer2 не может получить доступ к computer1, потому что он пытается получить доступ к общему ресурсу computer1 без входа в систему (нулевой сеанс) или учетным данным компьютера computer2 (DOMAIN\Computer2 $). Поскольку этот логин не имеет каких-либо прав, чтение текстового файла завершается неудачно.

Computer1 -> Скрипт запускается под вашей учетной записью -> Ваша учетная запись используется для доступа к Computer1 -> Работает нормально

Компьютер1 -> Запуск сценария на компьютере2 -> PowerShell подключается к WinRM с использованием вашей учетной записи -> У вас есть права доступа, поэтому WinRM принимает вызов -> PowerShell отправляет сценарии в WinRM -> WinRM запускает сценарий под своей учетной записью (Computer2 $) -> Computer1 видит входящий запрос к \txtfiles от учетной записи «Computer2 $» -> Эта учетная запись не имеет прав, поэтому доступ запрещен -> Ошибка

В качестве первого шага я бы попытался предоставить пользователю « Все права доступа для чтения» общий ресурс \txtfiles . Если это не помогает, попробуйте передать свой логин с -credential domain\YourName Invoke-Command .

Я предполагаю, что основная причина связана с Kerberos, поскольку в этом документе говорится, что WinRM может использовать делегирование имен пользователей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .