Invoke-SqlCmd2 в New-PSSession, используя NT AUTHORITY \ ANONYMOUS LOGON вместо учетной записи Windows (без удаленного взаимодействия) - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь запустить скрипт powershell, используя Invoke-SqlCmd2. По разным причинам мне нужно выполнить sql как определенную учетную запись Windows, для которой у меня есть учетные данные.

Первоначальный процесс, который выполняется, не выполняется как учетная запись домена, поэтому я использую учетные данные, которые необходимо создатьновый объект Credential, а затем используйте его для создания New-PSSession:

$password = ConvertTo-SecureString $credentialPass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($credentialUser, $password)

$sess = New-PSSession -credential $cred

Затем я Invoke-Command запускаю новый сеанс powershell от имени моего предоставленного пользователя.

Invoke-Command -Session $sess -ScriptBlock $sb

Внутри этого (блок сценария, файл и т. Д.) Я затем пытаюсь выполнить Invoke-SqlCmd2 как доверенное соединение

$resultListTable = Invoke-Sqlcmd2 -query $query -ServerInstance $ServerInstance  -Database $db -As "DataTable" -Debug

Сгенерированная строка соединения: Data Source=ZZZZ;Initial Catalog=XXXX;Integrated Security=True;Connect Timeout=15, но в результате получается ошибка:

Исключительная ситуация при вызове "Open" с аргументом (ами) "0": "Ошибка входа пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'."

Этот результат меня удивилЯ ожидал, что New-PSSession решит эту проблему для меня. С этой целью я попытался отладить вещи немного больше и добавил следующий код, чтобы объяснить мне, от какого пользователя, по мнению сценария, он работает.

$s = @"
  ** From .Net Environment        : [$([Environment]::UserDomainName)\$([Environment]::UserName)]
  ** From windows access token    : [$([Security.Principal.WindowsIdentity]::GetCurrent().Name)]
  ** From ps environment variables: [$($env:userdomain)\$($env:username)]
  ** From whoami                  : [$(whoami)]
  ** From WMI object              : [$(Get-WMIObject -class Win32_ComputerSystem | select username).username]
  ** From ps environment variables: [$($env:userdomain)\$($env:username)]
"@ 
Write-Host $s

, который выдает следующий вывод (перед тем, как сказать мне, что «NT AUTHORITY \ ANONYMOUS LOGON» не может войти в систему)

** Из среды .Net: [DOMAIN \ user]

** Из токена доступа Windows: [DOMAIN \ user]

** Из переменных среды ps: [DOMAIN \ user]

** От whoami: [DOMAIN \ user]

** Из WMIobject: [@ {username = DOMAIN \ brian} .username]

** Из переменных среды ps: [DOMAIN \ user]

На поверхности, кажется, нетВозможный способ использования анонимного входа. Сценарий, очевидно, выполняется от имени моего указанного пользователя (хотя объект WMI по-прежнему ссылается на меня).

Но, что еще более очевидно, это не так. Здесь должен быть еще один активный слой, которого я просто не вижу, какое-то недопонимание того, как на самом деле работает powershell.

Итак, основной, основной вопрос ... Как настроить сеанс powershell так, чтобыкогда запускается командлет Invoke-SqlCmd2, он работает как DOMAIN\user?

Примечания

Я не думаю , что удаленное взаимодействие здесь, так как я 'м всегда на одной машине. Но, может быть, это не имеет значения ...

...