通过 vb.net 在 powershell 中使用存储的凭据
Using stored credentials in powershell through vb.net
我写了两个应用;一种向客户端(服务器)发出 powershell 脚本,另一种执行传递给它的 powershell 脚本(客户端)。
我添加了检测特定脚本是否需要提升的功能。
如果脚本需要提升,服务器应用程序会提示用户输入其凭据。密码被转换为安全字符串并保存在 SQL 数据库中,用户名和脚本也是如此。
客户端应用程序获取脚本,如果需要提升,则获取用户名和安全字符串,然后尝试从中构建凭据对象。
该功能对于未提升的脚本运行良好,但提升的脚本不起作用。它没有出错或抛出异常(最终)但是脚本没有被执行。
此过程的第一部分将数据从 SQL 读取到数据表中,然后循环遍历该数据表的行。
一旦我得到包含需要 运行ning 的脚本的行,我就构建脚本。
以下是我在 VB...
中构建和执行 powershell 的方式
If this_routine_elevation_required = 1 Then
Dim scriptbody As String = row("scriptbody").ToString
Dim elevated_user_un As String = row("elevated_user").ToString
Dim elevated_user_ss As String = row("securestring").ToString
credential_script = "$securepassword = '" & elevated_user_ss & "' | ConvertTo-SecureString; $username='" & elevated_user_un & "';$credential = New-Object System.Management.Automation.PsCredential($username, $securepassword)"
action_response = RunPowershellScript(credential_script & "; " & scriptbody)
End If
这里是执行 powershell 的函数(使用'Imports System.Management.Automation)...
Private Function RunPowershellScript(ByVal scriptText As String) As String
' create Powershell runspace
Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()
MyRunSpace.Open()
Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline()
MyPipeline.Commands.AddScript(scriptText)
Dim results As Collection(Of PSObject) = MyPipeline.Invoke()
MyRunSpace.Close()
Dim MyStringBuilder As New StringBuilder()
For Each obj As PSObject In results
MyStringBuilder.AppendLine(obj.ToString())
Next
Return MyStringBuilder.ToString()
End Function
我在将脚本传递给 RunPowershellScript 函数之前抛出一个消息框,这样我可以确保没有任何格式错误或确保我没有做任何愚蠢的事情(我已经操纵安全字符串用于此图像)...
这里的例子只是一个测试,看看执行者是否可以停止 W32Time 服务,这通常需要提升。这是行不通的。
我从 RunPowershellScript 函数返回一个空响应,服务继续 运行。
我突然想到我正在从数据库中获取一个安全字符串,然后将该安全字符串转换为一个安全字符串,所以它可能不会以 $credential 中的正确有效密码结束,但据我了解我有为 PsCredential 的密码参数提供安全字符串,如果没有 -ConvertTo-SecureString,它将认为密码只是一个字符串。我试过了,它抛出了一个关于密码为空的异常。
谁能帮我指明正确的方向?
非常感谢。
脚本 运行 是在目标本地还是来自服务器?
凭据对象特定于创建它们的计算机和用户帐户,因此它们不可转让,只能在创建它们的计算机上使用。
我写了两个应用;一种向客户端(服务器)发出 powershell 脚本,另一种执行传递给它的 powershell 脚本(客户端)。
我添加了检测特定脚本是否需要提升的功能。 如果脚本需要提升,服务器应用程序会提示用户输入其凭据。密码被转换为安全字符串并保存在 SQL 数据库中,用户名和脚本也是如此。
客户端应用程序获取脚本,如果需要提升,则获取用户名和安全字符串,然后尝试从中构建凭据对象。
该功能对于未提升的脚本运行良好,但提升的脚本不起作用。它没有出错或抛出异常(最终)但是脚本没有被执行。
此过程的第一部分将数据从 SQL 读取到数据表中,然后循环遍历该数据表的行。 一旦我得到包含需要 运行ning 的脚本的行,我就构建脚本。
以下是我在 VB...
中构建和执行 powershell 的方式 If this_routine_elevation_required = 1 Then
Dim scriptbody As String = row("scriptbody").ToString
Dim elevated_user_un As String = row("elevated_user").ToString
Dim elevated_user_ss As String = row("securestring").ToString
credential_script = "$securepassword = '" & elevated_user_ss & "' | ConvertTo-SecureString; $username='" & elevated_user_un & "';$credential = New-Object System.Management.Automation.PsCredential($username, $securepassword)"
action_response = RunPowershellScript(credential_script & "; " & scriptbody)
End If
这里是执行 powershell 的函数(使用'Imports System.Management.Automation)...
Private Function RunPowershellScript(ByVal scriptText As String) As String
' create Powershell runspace
Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()
MyRunSpace.Open()
Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline()
MyPipeline.Commands.AddScript(scriptText)
Dim results As Collection(Of PSObject) = MyPipeline.Invoke()
MyRunSpace.Close()
Dim MyStringBuilder As New StringBuilder()
For Each obj As PSObject In results
MyStringBuilder.AppendLine(obj.ToString())
Next
Return MyStringBuilder.ToString()
End Function
我在将脚本传递给 RunPowershellScript 函数之前抛出一个消息框,这样我可以确保没有任何格式错误或确保我没有做任何愚蠢的事情(我已经操纵安全字符串用于此图像)...
这里的例子只是一个测试,看看执行者是否可以停止 W32Time 服务,这通常需要提升。这是行不通的。 我从 RunPowershellScript 函数返回一个空响应,服务继续 运行。
我突然想到我正在从数据库中获取一个安全字符串,然后将该安全字符串转换为一个安全字符串,所以它可能不会以 $credential 中的正确有效密码结束,但据我了解我有为 PsCredential 的密码参数提供安全字符串,如果没有 -ConvertTo-SecureString,它将认为密码只是一个字符串。我试过了,它抛出了一个关于密码为空的异常。
谁能帮我指明正确的方向?
非常感谢。
脚本 运行 是在目标本地还是来自服务器?
凭据对象特定于创建它们的计算机和用户帐户,因此它们不可转让,只能在创建它们的计算机上使用。