스크립트 블록을 사용하여 SQL Server를 쿼리하고 다른 Windows 자격 증명 집합을 전달하려고합니다. 이 스크립트는 SQL Server와 동일한 컴퓨터에서 실행되지만 원격으로 실행하면 실패합니다. SQL Server Managment Studio를 사용하여 SQL Server에 액세스하고 쿼리를 수동으로 실행할 수 있기 때문에 원격으로 SQL Server에 액세스 할 수 있다는 것을 알고 있습니다. 아래 코드를 사용하려고합니다. 스크립트에서 해당 지점보다 먼저 서버, 데이터베이스 및 쿼리를 지정합니다. 두 번째 홉 원격의 기쁨 아 다른 Windows 자격 증명을 사용하는 PowerShell 쿼리 원격 SQL Server
0
A
답변
1
그래서 문제가 무엇인지 알아 냈습니다. 앞에서 언급했듯이 Start-Job을 호출 할 때 매개 변수를 전달할 때 새로운 세션을 수정했습니다. SQL 연결 속성을 보면 사용자/암호가 전달되지 않으면 새 세션으로 전달한 자격 증명으로 Windows 인증을 통해 인증을 시도합니다. 문제는 다음과 같이 사용자 이름과 비밀번호를 제공 한 자격 증명에 대한 내 자신의 잘못입니다.
사용자 : [email protected]
암호 :
사용자 : 도메인 \ 사용자
암호 : mypassword
문제는 이렇게 할 필요가 있다는 것입니다 을 mypassword나는 그것이 차이를 만드는 이유는 모르겠지만 그렇습니다. 그 구문의 두 가지 모두 SQL Windows 인증과 같지만 어쩌면 그렇지 않다고 생각했습니다.
2
:
$credentials = Get-Credentials
#Script block
$sqlscript = {
#SQL variables
$sqlDataSource = $sqlServer
$sqlDatabase = $database
$connectionString = "Server="+$sqlDataSource+";Database="+$sqlDatabase+";Integrated Security=SSPI;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = New-Object System.Data.SqlClient.SqlCommand($queryString,$connection)
$command.CommandTimeout=$queryTimeout
# use dataset to get sql results
$dataset=New-Object system.Data.DataSet
$dataAdapter=New-Object system.Data.SqlClient.SqlDataAdapter($command)
[void]$dataAdapter.fill($dataset)
$connection.close()
# dataset has separate results tables
#$versionData = $dataset.Tables[0] #Version query results #not needed
$hardwareData = $dataset.Tables[1] #Hardware query results
$softwareData = $dataset.Tables[2] #Software query results
}
start-job -ScriptBlock $sqlscript -Credential $credentials
# output to separate CSV files
#$versionData | Export-CSV $outputPath -notype #not needed
$hardwareData | Export-CSV $outputPathHardware -notype
$softwareData | Export-CSV $outputPathSoftware -notype
이
은 작업의 상태입니다. 기본적으로 원격 powershell 세션을 만든 후에는 로그인 할 때 자격 증명이 실제로 두 번째 서버에 전달되지 않으므로 연결된 서버가 아닌 다른 서버의 리소스에 액세스 할 수 없습니다.이 문제를 해결하는 유일한 방법은 CredSSP authentication을 사용하는 것입니다. Enable-WSManCredSSP 표준 인증과 비교하여 CredSSP를 사용할 때 도입 된 몇 가지 특정 요구 사항 및 잠재적 문제점이 있으므로 링크를 반드시 읽으십시오.
아마도 누락되었습니다. 하지만 원격 세션을 시작하려고하지 않습니다. PowerShell 스크립트와 동일한 컴퓨터에서 새 세션을 만들고 있습니다. 해당 세션에 로그인 한 것과 다른 Windows 자격 증명 집합을 전달합니다. 스크립트 블록을 제거하고 SQL 서버에 대한 액세스 권한이있는 Windows 자격 증명으로 시스템에 로그인하면 제대로 작동합니다. SQL Server와 다른 컴퓨터에서 스크립트를 실행하더라도. – seanmt13
세션이 원격이거나 로컬인지 여부는 중요하지 않습니다. 자격 증명을 제공 한 세션의 표준 인증은 사용자 이름과 암호를 전달하지 않으므로 다른 시스템에 연결하는 데 사용할 수 없습니다. –
Start-Job을 호출하면 실제로 자격 증명이 전달됩니다. 이것이 스크립트 블록을 사용하는 요점입니다. 현재 세션과 다른 자격 증명으로 전화 할 수 있습니다. 올바른 방향으로 나를 가리키는 링크가 있습니다. [MSDN Start-Job] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/start-job) [Start-Job과의 SQL 연결] (http : // arthurremy.com/index.php/108-tips/338-access-sql-server-integrated-security-with-different-windows-credentials-in-powershell) – seanmt13