=================================================================================== 【项目需求】 为了方便在局域网内部署 Windows 平台下的软件。 希望通过一个局域网内的一台服务器,达到所有客户端可以通过一次操作(甚至是无需操作)就可以完成: 自动安装、升级软件的工作。 所以我想到了“域”和“脚本”。 于是在网上找了一些资料,作为一个解决方案。 ------------------------------------------------------------------------------------------------------------------------------------ 脚本应该完成以下功能: ① 客户端加入域。 ② 完成加入域的动作之后,自动重启。 ③ 重启后以域用户自动登录,进入用户界面。 ④ 直接运行 bat 脚本,从而进行安装、升级软件。 ------------------------------------------------------------------------------------------------------------------------------------ 此脚本在【客户端】运行 =================================================================================== set objShell=wscript.createObject("wscript.shell") objShell.Run "cmd.exe /c net user %username% password",0,true objShell.Run "cmd.exe /c label c: c",0,true objShell.Run "cmd.exe /c echo c|convert c: /fs:ntfs /x",0,true objShell.Run "cmd.exe /c netsh interface ip set dns ""本地连接"" static 192.168.1.254 primary",0,true objShell.Run "cmd.exe /c sc config LmHosts start= AUTO",0,true objShell.Run "cmd.exe /c net start lmhosts",0,true 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 strDomain = "weimeitc.ccc" strPassword = "qu6zhi.." strUser = "administrator" Set objNetwork = CreateObject("WScript.Network") strComputer = objNetwork.ComputerName Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _ strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _ strComputer & "'") ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _ strPassword, strDomain & "\" & strUser, NULL, _ JOIN_DOMAIN + ACCT_CREATE) Set ws = WScript.CreateObject("WScript.Shell") registrykey = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\" user = "qu6zhi" password = "Qast@" domain = "weimeitc.ccc" ws.RegWrite registrykey & "DefaultUserName", user ws.RegWrite registrykey & "DefaultPassword", password ws.RegWrite registrykey & "DefaultDomainName", domain ws.RegWrite registrykey & "AutoAdminLogon", 1 ws.RegWrite registrykey & "DontDisplayLastUserName", 0 ws.RegWrite registrykey & "ForceAutologon", 1 Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & "." & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Reboot() Next ===================================================================================
=================================================================================== ws.RegWrite registrykey & "ForceAutologon", 1 = 解决以下问题,使登录过程中可以直接进入用户界面。
=================================================================================== 清除服务器中的缓存解决以下问题。  删除客户端。
=================================================================================== 【以下是参考的内容】 =================================================================================== 参考资料 ① 《自动加入域的脚本》 ------------------------------------------------------------------------------------------------------------------------------------ set objShell=wscript.createObject("wscript.shell") wscript.echo "确定加入域,整个过程大概要1分钟左右。" //连接到文件服务器上服务器,0 表示 CMD 无前台黑窗提示,true 表示只有前条正确执行后才执行下一条。 objShell.Run "cmd.exe /c net user %username% password",0,true objShell.Run "cmd.exe /c label d: d",0,true objShell.Run "cmd.exe /c echo d|convert d: /fs:ntfs /x",0,true objShell.Run "cmd.exe /c reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ Advanced\Folder\SimpleSharing"" /v ""DefaultValue"" /t reg_dword /d ""00000000"" /f>nul",0,true objShell.Run "cmd.exe /c reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ Advanced\Folder\SimpleSharing"" /v ""CheckedValue"" /t reg_dword /d ""00000000"" /f>nul",0,true objShell.Run "cmd.exe /c reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ Advanced\Folder\SimpleSharing"" /v ""UncheckedValue"" /t reg_dword /d ""00000000"" /f>nul",0,true //修改本地连接主 DNS 为 PDC 服务器地址,如果 DNS 和 PDC 做在同一服务器上的话。修改辅助 DNS 为 10.10.10.11, objShell.Run "cmd.exe /c netsh interface ip set dns ""本地连接"" static 10.10.10.10 primary",0,true objShell.Run "cmd.exe /c netsh interface ip add dns ""本地连接"" 10.10.10.11",0,true //修改 TCP NETBIOS 服务状态为自动,并启动 netbios 服务,不然会提示加入域失败。 objShell.Run "cmd.exe /c sc config LmHosts start= AUTO",0,true objShell.Run "cmd.exe /c net start lmhosts",0,true //连接文件服务器,拷贝一个设置好的用户配置文件模板作为新建用户的配置。 //新建 D:\backup 目录 并修改注册表默认新建帐号的配置文件目录为 D:\backup\ objShell.Run "cmd.exe /c net use \\10.10.10.100 password /user:netsun",0,true objShell.Run "cmd.exe /c md d:\backup",0,true objShell.Run "cmd.exe /c xcopy ""\\10.103.33.7\软件\Default User"" ""d:\backup\Default User\"" /E /H /k",0,true objShell.Run "cmd.exe /c reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"" /v ""ProfilesDirectory"" /t reg_expand_sz /d ""d:\backup"" /f>nul",0,true //使用 winmgmts 服务实现加入域的功能 //strDomain = "domain.local" 域名 //strPassword = "user" //strUser = "password" 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 strDomain = "domain.local" strPassword = "user" strUser = "password" Set objNetwork = CreateObject("WScript.Network") strComputer = objNetwork.ComputerName Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _ strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _ strComputer & "'") ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _ strPassword, strDomain & "\" & strUser, NULL, _ JOIN_DOMAIN + ACCT_CREATE) //将 domain users 加入到本机的 administrator 组中,这个根据需要来做。 objShell.Run "cmd.exe /c net localgroup administrators ""domainname\domain users"" /add",0,true //加入域成功之后自动重启电脑 wscript.echo "确定重启电脑,请关闭所有窗口,保存好数据!" Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Shutdown)}!\\" & "." & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Reboot() Next 以上 vbs 脚本文件可以使用文件改造者来转换成 EXE 文件,发给客户端直接运行即可。 【脚本主要的一些改动】 ① 修改本机用户密码,以免用户加域后从本机登录。 ② 改动 D 盘为 NTFS 格式,去掉系统文件夹选项的简单共享,方便做权限。 ③ 改动本地连接的 DNS 为 DNS 服务器地址,这里有点勉强,应为不是所有的机器网卡都是本地连接,不过一般只要不是双卡的都正确的。 ④ 开启机器的 NetBios 解析服务,不然会提示加域失败的。 ⑤ 从文件服务器上拷贝一个修改好的默认配置文档到机器的 D:\backup,并修改注册表默认配置文件路径为D:\backup,这样做是为了以后装系统方便,不用导出用户在 C 盘上的资料,如桌面和搜藏夹等等。 ⑥ 将 Domain users 组加入到本机的 administrators 组中,这个因环境而定。 ⑦ 加域成功后自动重启。 具体的参数还是要根据实际情况改的。 不要直接运行了,可能会自动重启的,而且密码也会改掉。 =================================================================================== 参考资料 ② 《用户不自动登录到域时应用来自动执行登录过程中对旧的运行Windows 基础的计算机上启动脚本》 ------------------------------------------------------------------------------------------------------------------------------------ 【概要】 本文介绍了当您创建一个启动脚本以自动执行登录过程中对旧的运行 Microsoft Windows 基础的计算机上时,会发生的问题。 该启动脚本配置注册表项,以让用户自动登录到域。 但是,用户启动其计算机时,它们都不自动登录到域。 本文介绍了四种方法可用来变通解决此问题。 ------------------------------------------------------------------------------------------------------------------------------------ 【症状】 请考虑以下情形。创建启动脚本以自动登录过程中对旧的运行 Windows 基础的计算机上。该启动脚本配置注册表项,以让用户自动登录到域时它们启动计算机。例如对于您...请考虑以下情形。创建启动脚本以自动登录过程中对旧的运行 Windows 基础的计算机上。 该启动脚本配置注册表项,以让用户自动登录到域时它们启动计算机。例如对于您创建一个包含下面的代码的启动脚本 Set ws = WScript.CreateObject("WScript.Shell") registrykey = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\" user = "UserName" password = "Password" domain = "DomainName" ws.RegWrite registrykey & "DefaultUserName", user ws.RegWrite registrykey & "DefaultPassword", password ws.RegWrite registrykey & "DefaultDomainName", domain ws.RegWrite registrykey & "AutoAdminLogon", 1 ws.RegWrite registrykey & "DontDisplayLastUserName", 0 您创建了的域控制器上的组策略对象 (GPO) 和此 GPO 适用于对旧的运行 Windows 基础计算机的启动脚本。 但是,当用户开始其中一台计算机问题中,用户是不自动登录到域。 而应,显示 欢迎使用 Windows 对话框。用户必须按 CTRL + ALT + DELETE 在 欢迎使用 Windows 对话框中,然后手动登录到域。 ------------------------------------------------------------------------------------------------------------------------------------ 【原因】 出现此问题的原因是 Windows 基础对旧的处理策略的一个用户在在 欢迎使用 Windows 中按 CTRL + ALT + DELETE 后才启动脚本中包含...出现此问题的原因是 Windows 基础对旧的处理策略的一个用户在在 欢迎使用 Windows 中按 CTRL + ALT + DELETE 后才启动脚本中包含对话框。 ------------------------------------------------------------------------------------------------------------------------------------ 【替代方法】 警告如果您修改注册表错误地使用注册表编辑器或使用另一种方法,则可能会出现严重问题。 这些问题可能需要重新安装操作系统。 Microsoft 不能保证可以解决这些问题...警告如果您修改注册表错误地使用注册表编辑器或使用另一种方法,则可能会出现严重问题。这些问题可能需要重新安装操作系统。Microsoft 不能保证可以解决这些问题。修改注册表的风险由您自己承担。 要变通解决此问题,使用下列方法之一。 ------------------------------------------------------------------------------------------------------------------------------------ 方法 1: 修改 ForceAutlogon 注册表项的值设置为 1 启动脚本 修改启动脚本设置的该 ForceAutologon 值在 1 到以下注册表子项中的注册表项: HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon 若要执行此操作将下面的代码添加到末尾的启动脚本 ws.RegWrite registrykey & "ForceAutologon", 1 下面是一个包含代码的 ForceAutologon 注册表值设置为 1 的启动脚本的一个示例。 Set ws = WScript.CreateObject("WScript.Shell") registrykey = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\" user = "UserName" password = "Password" domain = "DomainName" ws.RegWrite registrykey & "DefaultUserName", user ws.RegWrite registrykey & "DefaultPassword", password ws.RegWrite registrykey & "DefaultDomainName", domain ws.RegWrite registrykey & "AutoAdminLogon", 1 ws.RegWrite registrykey & "DontDisplayLastUserName", 0 ws.RegWrite registrykey & "ForceAutologon", 1 注意 使用此方法时,用户必须重新启动计算机正在运行的 Windows 基础对旧的两个时间之前该用户自动登录到域。此外,您是否管理员不能使用远程桌面功能来远程登录到计算机。 ------------------------------------------------------------------------------------------------------------------------------------ 方法 2: 修改重新启动计算机启动脚本 修改启动脚本,使脚本配置注册表项后,重新启动计算机。 若要这样做,请按照下列步骤操作: 从到的 Drive 运行 Microsoft Windows Server 2003 或 Microsoft Windows XP 的计算机复制 Shutdown.exe 命令行工具: \Windows\System 对旧的运行 Windows 基础计算机上的文件夹。 将 Shutdown.exe 命令行添加到启动脚本。 The following is an example of a startup script that contains code that includes the Shutdown.exe command line. on error resume next Set ws = WScript.CreateObject("WScript.Shell") registrykey = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\" user = "UserName" password = "Password" domain = "DomainName" CurrentDomain = ws.RegRead (registrykey & "DefaultDomainName") CurrentPassword = ws.RegRead (registrykey & "DefaultPassword") CurrentAutoAdminLogon = ws.RegRead (registrykey & "AutoAdminLogon") CurrentUserName = ws.RegRead (registrykey & "DefaultUserName") if (CurrentUserName <> user) or _ (CurrentPassword <> password) or _ (CurrentDomain <> domain) or _ (CurrentAutoAdminLogon <> 1) then ws.RegWrite registrykey & "DefaultUserName", user ws.RegWrite registrykey & "DefaultPassword", password ws.RegWrite registrykey & "DefaultDomainName", domain ws.RegWrite registrykey & "AutoAdminLogon", 1 ws.RegWrite registrykey & "DontDisplayLastUserName", 0 ws.Run ("shutdown.exe -r -t 5 -f -d P:4:2") end if ------------------------------------------------------------------------------------------------------------------------------------ 方法 3: 对旧的禁用快速登录优化功能在 Windows 基础知识 禁用 Windows 中的快速登录优化功能对旧式的基础知识。若要执行此操作启用 $"总是等待网络在计算机启动和登录"策略设置。 若要以便该策略设置,请按照下列步骤操作: 打开相应的策略对象。 展开 计算机配置,展开 管理模板,展开 系统,然后单击 登录。 在右窗格中双击 $ 总是等待网络在计算机启动和登录。 单击 启用,然后单击 确定。 注意当您使用此方法在 欢迎使用 Windows 对话框将显示一个用户启动计算机时。在用户按下 CTRL + ALT + DELETE 后,用户登录到域。用户不必输入用户名或密码。 ------------------------------------------------------------------------------------------------------------------------------------ 方法 4: 指导用户等待前按下 CTRL + ALT + DELETE 的四个到五分钟 下次用户启动该的计算机时指示该用户等待之前他或她按下 CTRL + ALT + DELETE 欢迎使用 Windows 对话框中的四个到五分钟。在用户执行此过程一次后,用户将自动登录到域他或她启动计算机的每个后续时间。但是,用户必须执行此过程再次如果其他用户登录到 域在同一台计算机上。 =================================================================================== :start if exist "C:\Program Files\程序目录" goto sp3 msiexec /i "\\程序的网络路径\程序名.msi" /n /quiet :sp3 :end =================================================================================== 自动校准 windows xp 系统时间的脚本 ① 新建一个文本文件,在里面输入以下内容 net time /SETSNTP:210.72.145.44 w32tm /once 'Win2000下 w32tm /resync 'WinXP 下 保存后,将文件名改为 ResyncTime.bat ② 在[开始]---[运行]中输入“gpedit.msc"(不包括引号) 在出来的组策略选择【Windows设置】——[脚本(启动关机)]在启动添加刚才建立的批处理文件,保存后即可。以后计算机在开机时每次都会与 Internet 授时服务器同步了。 ③ 查询时间服务器 net time /QUERYSNTP -------------------------------------------------- @echo off set RSYNC_HOME=d:\Program Files\cwRsync\bin cd %RSYNC_HOME% d: rsync -avzP --progress --delete --password-file=/cygdrive/d/pass/rsync.passwd SvcCWRSYNC@192.168.101.62::rsync /cygdrive/d/file 命令参数解释: -avzP -a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件; -z 传输时压缩; -P 传输进度; -v verbose,详细模式输出 -u是只同步已经更新的文件,避免没有更新的文件被重复更新一次,不过要注意两者机器时钟的同步 --progress 显示备份过程 --delete 删除那些DST中SRC没有的文件 --password-file 指定密码文件,只需包含密码而不用包含用户名 SvcCWRSYNC@192.168.101.62::rsync SvcCWRSYNC 登陆服务器端的用户名 192.168.101.62 服务器端的ip地址 rsync 服务器端指定的认证模块名,多个同步作业靠此模块名区分 /cygdrive/d/file 存放服务器端同步文件的本地目录 4、配置系统作业,运行脚本选择rsync.bat,客户端配置完毕。 =================================================================================== 感谢“谭学士”对我的帮助。 |