Сценарий PowerShell не может аутентифицировать пользователя при запуске Invoke-Command

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

Сначала он извлекает информацию о сайтах из файла .csv, а затем использует эту информацию для составления строки для полного доменного имени контроллера домена и сервера .10.

Затем он запрашивает пароль для моей учетной записи с повышенными правами, используемой для получения информации о дисках.

У меня возникла проблема, когда сценарий создает блок сценария, а затем использует Invoke-Command, отправляет блок сценария на серверы и возвращает объект PowerShell с информацией.

Указанная ошибка приведена ниже:

[{ServerName}] Connecting to remote server {ServerName} failed with the
following error message : WinRM cannot process the request. The following
error with errorcode 0x80090311 occurred while using Kerberos authentication: 
There are currently no logon servers available to service the logon request.
Possible causes are:
  -The user name or password specified are invalid.
  -Kerberos is used when no authentication method and no user name are specified.
  -Kerberos accepts domain user names, but not local user names.
  -The Service Principal Name (SPN) for the remote computer name and port does
   not exist.
  -The client and remote computers are in different domains and there is no trust
   between the two domains.
After checking for the above issues, try the following:
  -Check the Event Viewer for events related to authentication.
  -Change the authentication method; add the destination computer to the WinRM
   TrustedHosts configuration setting or use HTTPS transport.
Note that computers in the TrustedHosts list might not be authenticated.
  -For more information about WinRM configuration, run the following command:
   winrm help config. For more information, see the about_Remote_Troubleshooting
   Help topic.
    + CategoryInfo          : OpenError: ({ServerName}:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AuthenticationFailed,PSSessionStateBroken

Что я пробовал:

  • Сброс моего пароля

  • Изменение типа аутентификации на Basic

  • Заставить других попробовать то же самое - у одних такая же проблема, у других нет
  • У других пользователей на моих рабочих станциях такая же проблема
  • Я переустановил образ своей рабочей станции, и она некоторое время работала, но затем снова остановилась, поскольку она, казалось, останавливалась после того, как устройство установило обновления программного обеспечения, поэтому я нахожусь в процессе удаления этих обновлений, однако два из них не позволяют мне для удаления, я предполагаю, что Microsoft принудительно устанавливает их и требует установки (кнопка удаления исчезает при выборе) - KB4019472 и KB4049065.

Устройство работает под управлением Windows 10 1607 v14393.1944, PowerShell v5.1.

Существует одностороннее доверие между доменом, в котором я нахожусь, и доменами, в которых находятся DC1 и MS10 (.10), домены доверяют нам, но мы не доверяем доменам.

Я использую учетную запись локального администратора на устройстве через вложенную группу AD во всех доменах.

Я не очень разбираюсь в Kerberos, поэтому любая помощь была бы замечательной.

Сценарий приведен ниже: Примечание. Мне пришлось удалить некоторые части, поэтому я заполнил область тем, что должно быть там (например, {String}, где должен быть только стандартный текст, и {FQDNServerName}, где должен быть Имя сервера FQDN, записанное в виде текста, или {Region}, где регион был бы написан в виде текста}).

$csvSchoolsLoc = "{FQDNServerName}\SharedReports$\SchoolsExport.csv"
$Schools = Import-Csv $csvSchoolsLoc -Delimiter "`t" -Header LocCode,SchoolName,SchoolAddress,SchoolPhoneNumber,SchoolFaxNumber,SchoolOfficerInCharge,DistrictCode,DistrictNumeric,RegionCode,RegionNumeric,LSD,WANLinkType,RouterName,RouterIP,RouterStatus,OneSchemaGraphUrl,OneSchemaSiteUrl,SCCMSiteID,SiteAdminNetwork,ProxyServerIP,PrimaryDcName,PrimaryDcIP,PrimaryDcOS,PrimaryDcVersion,PrimaryDcPatch,Style

#Gets the users credentials for their GBN ZZ account - this is used throughout the script for authentication
$username = "{Region}\zz-$env:USERNAME"
$mycreds = Get-Credential -UserName $username -Message "Enter your password for {region}\zz-$env:USERNAME"

Clear-Host
Write-Host "What is the schools 4 digit site code?" -ForegroundColor Magenta
$Global:SiteCode = Read-Host

Function Main {
    Clear-Host

    $SchoolName = $schools | Where-Object {$_.LocCode -eq $SiteCode} | ForEach-Object SchoolName

    $Region = $schools | Where-Object {$_.LocCode -eq $SiteCode} | ForEach-Object RegionCode

    Write-Host "Getting details for: " -ForegroundColor Gray -NoNewline; Write-Host "$SchoolName - $SiteCode - ($Region)"-ForegroundColor Yellow

    $DC1 = "{String}$($Region)$($SiteCode)001.$region.{String}.{String}.{String}"
    $MS10 = "{String}$($Region)$($SiteCode)010.$region.{String}.{String}.{String}"

    if (Test-Connection -ComputerName $DC1 -Count 2 -Delay 1 -Quiet) {
        $DC1Run = $true
    } else {
        $DC1Run = $false
    }
    if (Test-Connection -ComputerName $MS10 -Count 2 -Delay 1 -Quiet) {
        $MS10Run = $true
    } else {
        $MS10Run = $false
    }

    $ScriptBlock = {
        $DiskCTotal = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'" -Impersonation 3 | ForEach-Object {$_.size / 1GB}
        $DiskCFree = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'" -Impersonation 3 | ForEach-Object {$_.freespace / 1GB}
        $DiskZTotal = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='Z:'" -Impersonation 3 | ForEach-Object {$_.size / 1GB}
        $DiskZFree = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='Z:'" -Impersonation 3 | ForEach-Object {$_.freespace / 1GB}

        return @{
            'ZFreeSpace' = $DiskZFree
            'CFreeSpace' = $DiskCFree
            'ZTotalSize' = $DiskZTotal
            'CTotalSize' = $DiskCTotal
        }
    }
    if (($DC1Run -eq $true) -and ($MS10Run -eq $true)) {
        $ServerDC1 = Invoke-Command -ComputerName $DC1 -Credential $mycreds -ScriptBlock $ScriptBlock
        $ServerMS10 = Invoke-Command -ComputerName $MS10 -Credential $mycreds -ScriptBlock $ScriptBlock

        #Clear-Host
        Write-Host -ForegroundColor Yellow "$SchoolName - $SiteCode - ($Region)"
        Write-Host -ForegroundColor Cyan "Server $DC1 - Domain Controller"
        Write-Host "$([math]::round($ServerDC1.CFreeSpace,2)) GB free on C Drive (Total Size $([math]::round($ServerDC1.CTotalSize,2)) GB)"
        Write-Host "$([math]::round($ServerDC1.ZFreeSpace,2)) GB free on Z Drive (Total Size $([math]::round($ServerDC1.ZTotalSize,2)) GB)"
        Write-Host "" 
        Write-Host -ForegroundColor Cyan "Server $MS10 - Distribution Point"
        Write-Host "$([math]::round($ServerMS10.CFreeSpace,2)) GB free on C Drive (Total Size $([math]::round($ServerMS10.CTotalSize,2)) GB)"
        Write-Host "$([math]::round($ServerMS10.ZFreeSpace,2)) GB free on Z Drive (Total Size $([math]::round($ServerMS10.ZTotalSize,2)) GB)"
    } else {
        #Clear-Host
        Write-Host -ForegroundColor Yellow "$SchoolName - $SiteCode - ($Region)"
        Write-Host -ForegroundColor Cyan "Server $DC1 - Domain Controller"
        if ($DC1Run) {
            Write-Host "DC1 connection status is running" -ForegroundColor Green
        } else {
            Write-Host "DC1 connection status is down" -ForegroundColor Red
        }
        Write-Host "" 
        Write-Host -ForegroundColor Cyan "Server $MS10 - Distribution Point"
        if ($MS10Run) {
            Write-Host "MS10 connection status is running" -ForegroundColor Green
        } else {
            Write-Host "MS10 connection status is down" -ForegroundColor Red
            if ($DC1Run -eq $true) {
                $RDP = Read-Host -Prompt "Would you like to RDP to $DC1 'Y'"
                if ($RDP -eq "Y") {
                    Start-Process -FilePath "$env:windir\System32\mstsc.exe" -ArgumentList "/v:$DC1" -Wait -WindowStyle Maximized
                }
            }
        }
    }
    Write-Host ""
    Write-Host "What is the next schools 4 digit site code? -or- Press Enter to retry the above site again" -ForegroundColor Magenta
    $Entry = Read-Host
  if ($Entry -eq "") {
    # Do nothing
  } else {
    $Global:SiteCode = $Entry
  }
}

$x = 0

do {
    Main
} until ($x -gt 0)

РЕДАКТИРОВАТЬ: удаление обновлений программного обеспечения не решило проблему, поэтому, если это не связано с теми двумя обновлениями, которые я не могу удалить, это не похоже на обновления программного обеспечения.


person Random206    schedule 30.01.2018    source источник
comment
Для получения дополнительной информации о конфигурации WinRM выполните следующую команду: winrm help config. Дополнительные сведения см. в разделе справки about_Remote_Troubleshooting. Вы это сделали? Вы сделали что-нибудь еще, что предлагает сообщение об ошибке?   -  person Ansgar Wiechers    schedule 30.01.2018
comment
@AnsgarWiechers Да, но я не до конца понимаю, что делаю.   -  person Random206    schedule 30.01.2018
comment
Не настоящее решение вашей проблемы, но командлет Get-WMIObject также поддерживает параметр -credentials (это зависит от RPC, а не от WSMan). Об ошибке, которую вы получаете: Invoke-Command также поддерживает параметр аутентификации, где вы можете указать, какой метод аутентификации вы хотите использовать (я недостаточно знаю вашу среду, чтобы знать, действительно ли вам нужно использовать Kerberos или другой тип аутентификации)   -  person bluuf    schedule 30.01.2018
comment
Спасибо @bluuf, извините, я должен был добавить это как то, что я пробовал, но я попытался изменить тип аутентификации, чтобы использовать базовый, а что нет, и ошибка все еще возникает. Когда я завтра буду на работе, я опубликую ошибку, которую я получаю тогда, я думаю, что это немного по-другому. Я считаю, что Get-WmiObject действительно работает, однако я хотел поместить все это в один блок сценария, чтобы ему не приходилось переходить туда и обратно, как на некоторых наших более медленных сайтах или ссылках ADSL и т. д.   -  person Random206    schedule 30.01.2018


Ответы (1)


Оказывается, домены, к которым я пытаюсь подключиться, отсутствуют в моей конфигурации TrustedHosts для WinRM.

С помощью следующей команды я смог добавить домены (которых у меня много) в TrustedHosts, используя подстановочный знак «*».

ПРИМЕЧАНИЕ. Я заменил часть домена на {String}, где обычно есть часть доменного имени по соображениям конфиденциальности.

winrm set winrm/config/client @{TrustedHosts="<local>,*.{string}.edu.au"}
person Random206    schedule 30.01.2018