在我们的环境中,我们为一些用户提供了部署他们自己的 Windows 桌面的能力。这发生在两个部分;
首先,他们使用一个工具在 AD 中创建一个计算机帐户,设置一些其他设置,但最终授予他们对该对象的写入权限,以便能够进行域加入。
其次,通过 PXE 引导使用 WDS/MDT,他们可以启动构建。构建在没有域凭据的情况下开始,并在最后启动一个 HTA 程序,该程序使用他们的凭据加入域。
一切正常,但我正在尝试进行一些调整。
到目前为止我的工作。 HTA 域加入文件包含执行以下操作的 VBScript;
我要添加的是检查用户是否具有计算机对象的完全控制权,以便更好地确定加入是否成功。我使用 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 让我走到这一步,我认为它可能让我误入歧途:)
我在正确的道路上吗,或者我应该用另一种方式检索它。请记住,它需要从不在域中的机器上检索。
提前致谢!