【发布时间】:2020-03-29 04:24:43
【问题描述】:
我正在尝试执行Invoke-Sqlcmd 命令(来自SqlServer module)以其他 AD 用户身份运行查询。我知道有 -Credential 参数,但这似乎不起作用。
因此,我认为使用Start-Job 可能是一种选择,如下面的sn-p 所示。
$username = 'dummy_domain\dummy_user'
$userpassword = 'dummy_pwd' | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential ($username, $password)
$job = Start-Job -ScriptBlock {Import-Module SqlServer; Invoke-Sqlcmd -query "exec sp_who" -ServerInstance 'dummy_mssql_server' -As DataSet} -Credential $credential
$data = Receive-Job -Job $job -Wait -AutoRemoveJob
但是,当查看作业返回的变量类型时,它不是我所期望的。
> $data.GetType().FullName
System.Management.Automation.PSObject
> $data.Tables[0].GetType().FullName
System.Collections.ArrayList
如果我直接运行ScriptBlock中的代码,这些是PS返回的变量类型:
> $data.GetType().FullName
System.Data.DataSet
> $data.Tables[0].GetType().FullName
System.Data.DataTable
我尝试将$data 变量强制转换为[System.Data.DataSet],导致出现以下错误消息:
Cannot convert value "System.Data.DataSet" to type "System.Data.DataSet".
Error: "Cannot convert the "System.Data.DataSet" value of type
"Deserialized.System.Data.DataSet" to type "System.Data.DataSet"."
问题:
- 有没有更好的方法在不同的 AD 帐户下运行 SQL 查询,使用
Invoke-Sqlcmd命令? - 有没有办法在调用
Receive-Job时获得正确/预期的变量类型?
更新
当我运行$data.Tables | Get-Member 时,返回的属性之一是:
Tables Property Deserialized.System.Data.DataTableCollection {get;set;}
【问题讨论】:
-
这是预期 - 作业在不同的进程中运行,因此数据必须在返回给您之前进行序列化和反序列化
-
@MathiasR.Jessen 这是否意味着在反序列化对象时变量类型出了问题?有没有办法完全按照以前的方式反序列化对象?
标签: sql-server powershell