Powershell 在dsquery命令身份验证中使用SecureString密码对象

Powershell 在dsquery命令身份验证中使用SecureString密码对象,powershell,securestring,dsquery,Powershell,Securestring,Dsquery,我按照以下指南创建了密码。 现在,我需要使用dsquery选项-s(服务器)-u(用户)和-p(密码)登录到外部域控制器 当我以明文形式输入密码时,我得到了身份验证。 一旦使用SecureString对象,我就无法进行身份验证。 我尝试了几个选项,但无法运行 你有什么想法吗?唯一的方法是解密SecureString对象并将其作为字符串获取 下面是一个示例函数: function ConvertTo-String { param( [Security.SecureString] $se

我按照以下指南创建了密码。 现在,我需要使用dsquery选项-s(服务器)-u(用户)和-p(密码)登录到外部域控制器

当我以明文形式输入密码时,我得到了身份验证。 一旦使用SecureString对象,我就无法进行身份验证。 我尝试了几个选项,但无法运行


你有什么想法吗?

唯一的方法是解密
SecureString
对象并将其作为字符串获取

下面是一个示例函数:

function ConvertTo-String {
  param(
    [Security.SecureString] $secureString
  )
  try {
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
    [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
  }
  finally {
    if ( $bstr -ne [IntPtr]::Zero ) {
      [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    }
  }
}
注意:解密
SecureString
对象会绕过
SecureString
对象提供的保护

如果您坚持使用
dsquery
命令,这是唯一的选项,因为它需要在命令行上输入纯文本密码。这本身就是不安全的


相反,我建议使用Active Directory cmdlet,它可以直接使用
SecureString
,而无需转换为纯文本。

dsquery
是一种命令行可执行文件。它不能解释对象,只能解释纯文本,因此您需要将
securestring
转换为
纯文本
,并以这种方式传递。我建议阅读以使用
powershell
AD
交互。感谢您对AD cmdlet的提示。我要试试那些。
function ConvertTo-String {
  param(
    [Security.SecureString] $secureString
  )
  try {
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
    [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
  }
  finally {
    if ( $bstr -ne [IntPtr]::Zero ) {
      [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    }
  }
}