【问题标题】:Using stored credentials in powershell through vb.net通过 vb.net 在 powershell 中使用存储的凭据
【发布时间】:2019-06-11 11:03:28
【问题描述】:

我已经编写了一对应用程序;一种向客户端(服务器)发出 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的函数(使用'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,它将认为密码只是一个字符串。我试过这个,它抛出了一个关于密码为空的异常。

谁能帮我指出正确的方向?

提前非常感谢。

【问题讨论】:

  • docs.microsoft.com/en-us/powershell/module/… 上的示例 1 所示,您转换安全字符串的方式似乎是有效的。能否显示scriptbody 变量的全部内容?
  • 脚本是在目标本地运行还是从服务器运行?凭据对象特定于创建它们的计算机和用户帐户
  • 脚本在不同的机器上运行,而不是在它们被输入并转换为安全字符串的机器上。那么它是否可能只是一个“拒绝访问”类型的场景,因为它不接受传递给它的凭据?如果是这样,是否有其他方法可以实现这一目标?
  • scriptbody = "Stop-Service -name w32time" 在这个实例中
  • 所以实际上并没有使用凭据?即便如此,怀疑论者还是有道理的。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2016-02-10
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多