我正在编写一个AutoIT(&VBS)脚本,以便从Windows(7)锁定屏幕将PC加入域。我已经用我的脚本替换了system32文件夹中的Utilman.exe。当在Windows锁定屏幕上单击易于访问按钮时,我的Autoit GUI会出现,显示IP、PC名称,并为最终用户提供一些自助按钮。
GUI上的一个按钮调用一个函数,在电脑脱离域后将其重新加入域。我的问题是,在锁定屏幕上,"加入域"按钮会运行,但不会将电脑加入域。即使在重新启动之后。如果我登录到管理员帐户并单击相同的"加入域"按钮,电脑将被添加到域中而不会出现问题。这让我很困惑,因为我的脚本在锁屏幕上以SYSTEM用户的身份运行。非常感谢您对此问题的任何意见或建议!
我用来将PC连接到域的功能如下。它在登录到管理员帐户时工作,但不会从Windows锁定屏幕将PC加入域
编辑:域脚本来自此示例:http://www.vbsedit.com/scripts/ad/computer/scr_5.asp
从锁定屏幕运行脚本的想法来自下面的示例。我用我的脚本替换了Utilman.exe,将我的脚本命名为Utilman.exe,并将其放在system32文件夹中https://www.technibble.com/bypass-windows-logons-utilman/
Func joinDomain()
$file = FileOpen("C:ITjoinDomain.vbs", 1)
FileWriteLine($file, 'Const JOIN_DOMAIN = 1')
FileWriteLine($file, 'Const ACCT_CREATE = 2')
FileWriteLine($file, 'Const ACCT_DELETE = 4')
FileWriteLine($file, 'Const WIN9X_UPGRADE = 16')
FileWriteLine($file, 'Const DOMAIN_JOIN_IF_JOINED = 32')
FileWriteLine($file, 'Const JOIN_UNSECURE = 64')
FileWriteLine($file, 'Const MACHINE_PASSWORD_PASSED = 128')
FileWriteLine($file, 'Const DEFERRED_SPN_SET = 256')
FileWriteLine($file, 'Const INSTALL_INVOCATION = 262144')
FileWriteLine($file, ' ')
FileWriteLine($file, 'strDomain = "Domain.net"')
FileWriteLine($file, 'strPassword = "joinDomainPassword"')
FileWriteLine($file, 'strUser = "SDSUser"')
FileWriteLine($file, ' ')
FileWriteLine($file, 'Set objNetwork = CreateObject("WScript.Network")')
FileWriteLine($file, ' strComputer = objNetwork.ComputerName')
FileWriteLine($file, ' ')
FileWriteLine($file, 'Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\" & _')
FileWriteLine($file, ' strComputer & "rootcimv2:Win32_ComputerSystem.Name=''" & _ ')
FileWriteLine($file, ' strComputer & "''") ')
FileWriteLine($file, ' ')
FileWriteLine($file, 'ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _')
FileWriteLine($file, ' strPassword, strDomain & "" & strUser, NULL, _')
FileWriteLine($file, ' JOIN_DOMAIN + ACCT_CREATE)')
FileClose($file)
Sleep(100)
RunWait(@ComSpec & " /c " & 'wscript.exe C:ITjoinDomain.vbs', @SystemDir, @SW_HIDE)
sleep(1000)
FileDelete("C:ITjoinDomain.vbs")
messageBox()
EndFunc
这是上面VBS脚本的完整AutoIT版本。当我以管理员身份登录时,它工作得很好,但当我打电话时,我收到了一个错误2717Windows锁定屏幕中的相同功能。
Const $JOIN_DOMAIN = 1
Const $ACCT_CREATE = 2
Const $ACCT_DELETE = 4
Const $WIN9X_UPGRADE = 16
Const $DOMAIN_JOIN_IF_JOINED = 32
Const $JOIN_UNSECURE = 64
Const $MACHINE_PASSWORD_PASSED = 128
Const $DEFERRED_SPN_SET = 256
Const $INSTALL_INVOCATION = 262144
Const $DOMAIN = "Domain.net"
Const $ADMINKENNWORT = "Password"
Const $ADMIN = "SDUser"
Const $COMPUTER = @ComputerName
$objComputer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\" & $COMPUTER & "rootcimv2:Win32_ComputerSystem.Name='" & $COMPUTER & "'")
$Result = $objComputer.JoinDomainOrWorkGroup($DOMAIN, $ADMINKENNWORT, $DOMAIN & "" & $ADMIN, "", $JOIN_DOMAIN + $ACCT_CREATE)
If ($Result <> 0) Then
MsgBox(0, "Error Joining the Domain", $COMPUTER & " Error code: " & $Result )
EndIf
使用wmi。这里是一个UDF。
Func _SetWorkGroup($WorkGroup)
;================================
;Usage:_SetWorkGroup(WprkGroup Name)
;Make By Sanhen
;================================
Local $objNetwork, $strComputer
$objNetwork = ObjCreate("WScript.Network")
$strComputer = $objNetwork.ComputerName
$objComputer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\" & _
$strComputer & "rootcimv2:Win32_ComputerSystem.Name='" _
& $strComputer & "'")
Return $objComputer.JoinDomainOrWorkGroup($WorkGroup)
EndFunc ;==>_SetWorkGroup
我认为您只是遇到了一个权利问题。尝试将此添加到脚本的顶部:
#RequireAdmin