通过vb.net在Powershell中使用存储的凭据

时间:2019-06-11 11:03:28

标签: vb.net powershell visual-studio-2017 credentials securestring

我写了两个应用程序;一种是向客户端(服务器)发出Powershell脚本,另一种是执行传递给客户端的Powershell脚本(客户端)。

我添加了一些功能来检测特定脚本是否需要提升。 如果脚本需要提升,则服务器应用会提示用户输入其凭据。密码将与用户名以及脚本一起转换为安全字符串并保存在SQL数据库中。

客户端应用抓取脚本,如果需要提升权限,则抓取用户名和安全字符串,然后尝试从中构建凭证对象。

该功能对于非高架脚本正常运行,但是高架脚本不起作用。 (最终)不会出错或引发异常,但不会执行脚本。

此过程的第一部分将数据从SQL读取到数据表中,然后循环遍历该数据表的行。 在包含需要运行的脚本的行之后,就可以构建脚本。

这是我在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的功能(使用“导入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函数之前,我已经抛出了一个脚本消息框,因此我可以确保没有任何错误,或者确保我没有做任何愚蠢的事情(为此图像我已经操纵了安全字符串) )...

messagebox - powershellscript

这里的示例只是一个测试,用于查看执行程序是否可以停止W32Time服务,而这通常需要提升。这是行不通的。 我从RunPowershellScript函数得到一个空响应,该服务继续运行。

在我看来,我是从数据库中获取一个安全字符串,然后将该安全字符串转换为安全字符串,因此它可能不会以$ credential中的正确有效密码结尾,但是据我了解,我必须提供PsCredential的password参数的安全字符串,并且如果没有-ConvertTo-SecureString,它将认为密码只是一个字符串。我尝试了此操作,但密码为空引发了异常。

有人可以帮我指出正确的方向吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

该脚本是在目标服务器上还是在服务器本地运行?

凭据对象特定于创建它们的计算机和用户帐户,因此它们不可转让,只能在创建它们的计算机上使用。