如何使用备用凭证(或替代凭证)检索 ntSecurityDescriptor

问题描述 投票:0回答:0

在我们的环境中,我们为一些用户提供了部署他们自己的 Windows 桌面的能力。这发生在两个部分;

首先,他们使用一个工具在 AD 中创建一个计算机帐户,设置一些其他设置,但最终授予他们对该对象的写入权限,以便能够进行域加入。

其次,通过 PXE 引导使用 WDS/MDT,他们可以启动构建。构建在没有域凭据的情况下开始,并在最后启动一个 HTA 程序,该程序使用他们的凭据加入域。

一切正常,但我正在尝试进行一些调整。

到目前为止我的工作。 HTA 域加入文件包含执行以下操作的 VBScript;

  • 标识域控制器
  • 使用 LDAP 的备用凭证
  • 查询域控制器是否存在计算机对象,以及 检索专有名称
  • 如果存在,警告用户 没有创建它,连接可能会失败
  • 如果不存在, 警告用户它可能会失败
  • 然后它将尝试域 加入,如果成功就报告并继续前进。

我要添加的是检查用户是否具有计算机对象的完全控制权,以便更好地确定加入是否成功。我使用 ntSecurityDescriptor 得到了这个工作......但是来自加入域的机器。它在需要它的非域机器上失败。

以下作品(使用具有完全控制权的用户或我的管理员帐户)来自加入域的机器;

Set objComputer = GetObject("LDAP://" & strDomainController & "/" & strComputerDN)
Set objSD = objComputer.Get("ntSecurityDescriptor")
Set objDACL = objSD.DiscretionaryAcl

它继续将用户名与每个受托人进行比较,以确定是否有条目,如果访问掩码是 983551,我们就知道用户拥有全部权限。

从非域 PC 上,我收到“发生操作错误”...所以我认为我还需要此部分来针对备用凭据运行。

我现在拥有的是以下内容,无论我是否运行加入域,它都会失败。

' Create ADO connection object with alternate credentials
Set objCommandUser = CreateObject("ADODB.Command")
Set objConnectionUser = CreateObject("ADODB.Connection")
objConnectionUser.Provider = "ADsDSOObject"
objConnectionUser.Properties("User ID") = strUsername
objConnectionUser.Properties("Password") = strPassword
objConnectionUser.Properties("Encrypt Password") = TRUE
objConnectionUser.Open "Active Directory Provider"
objCommandUser.ActiveConnection = objConnectionUser

' Execute an ADO query to retrieve the security descriptor of the computer object
strQueryUser = "<LDAP://" & strDomainController & "/" & strComputerDN & ">;(objectCategory=computer);ntSecurityDescriptor,name;subtree"
msgbox strQueryUser

objCommandUser.CommandText = strQueryUser
objCommandUser.Properties("Page Size") = 100
objCommandUser.Properties("Timeout") = 30
objCommandUSer.Properties("Cache Results") = False

Set objRecordSetUser = objCommandUser.Execute(strQueryUser)
' Check if the query returned any results

If Not objRecordSetUser.EOF Then
strConfName = objRecordSetUser.Fields("name")
msgbox "Record found " & StrConfName

' Retrieve the security descriptor from the query results
Set objSecurityDescriptor = objRecordSetUser.Fields("ntSecurityDescriptor").Value
Set objDACL = objSecurityDescriptor.DiscretionaryAcl

' Check if the specified user has Full Control permission on the computer object
For Each objACE In objDACL
If objACE.Trustee = strUsername And objACE.AccessMask = 983551 Then
' Full Control permission
msgbox strUsername & " has Full Control permission on " & strComputerDN
Exit For
End If
Next
Else
msgbox "Computer object " & strComputerDN & " not found"
End If

我得到的是“需要的对象:'objRecordSetUser.Fields(...).Value'

我认为这是因为我得到的 ntSecurityDescriptor 为 NULL...我在 strConfName 中添加以确认我实际上得到了一个结果并返回了计算机对象的名称,它正在工作所以我知道我正在创纪录...但我开始认为我无法通过这种方式检索 ntSecurityDescriptor。

现在全面披露,ChatGPT 让我走到这一步,我认为它可能让我误入歧途:)

我在正确的道路上吗,或者我应该用另一种方式检索它。请记住,它需要从不在域中的机器上检索。

提前致谢!

vbscript ldap adodb
© www.soinside.com 2019 - 2024. All rights reserved.