AutoIT 和 VBS - 从 Windows 锁定屏幕将 PC 添加到域



我正在编写一个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

最新更新