SCCM:在OSD/WinPE中查询域信息的方案

前言
我喜欢或者说只愿意分享一些技巧性地技术方案,而不是配置方案或者入门指引,也就是说我的文章假设你已经为前置技能加点了。


环境
SCCM 2012


背景
SCCM OSD默认情况下是非交互式静默安装系统的,如果配合MDT的话就可以实现交互式安装了。不过我不喜欢MDT的操作界面,所以我自己开发了一个HTA(这个HTA以后有机会再分享,毕竟HTA其实是开发的内容,你要有一定脚本和HTML的编写经验才行),它提供了一些选项,比如选择安装win7 64还是Win7 32位系统,安装什么可选软件等待。其中有个功能需要检查计算机是否存在域中(PS:我没有说手动输入啊,重装电脑的话SCCM自动根据UUID会识别原有计算机名,也就是"_SMSTSMachineName")

有这个需求后,我当时就bing了(谷歌节哀,另外记住搜索是你的最好的朋友,就算你在牛A与牛C之间,参考别人的经验也对你百利而无一害),找到某位同学问的帖子
http://bbs.winos.cn/thread-136160-1-1.html
这位同学也是想在OSD中查询,好吧二楼脚本不错,脚本有着落了,谢谢二楼。当然楼主回复说不行,嗯当然这个脚本要稍微修改一下了,还有WinPE。



技术分析
首先,脚本运行在什么环境?没错,WinPE。WinPE是什么大家应该都知道,其实它就是一个精简的Windows系统。所以它只有少部分DLL运行库和exe程序。当然它也有一些WinPE特有工具。所以说它没有dsquery,没有ADSI(二楼脚本就不能运行了)。另外微软在ADK/AIK中提供了一些cab,比如WMI,Scripting,HTA等,它可以为WinPE提供额外的功能。不过就是没有ADSI。还好国外有能人提取了ADSI,有了ADSI后,你就可以查询域的信息了。


其次,WinPE没有加域,这是什么意思呢,用过KMS的同学可能知道(我说不是网上盗版激活的那些,是真正的啊),没有加域电脑不能激活Windows,不过手动指向KMS服务器就能激活了,这因为没加域电脑没有权限查询到KMS服务器。二楼脚本也一样。它需要指定DC服务器


操作过程

终于转入正题了,不过我觉得上面的思路还是很重要的,毕竟大家都会勾股定理,会不会用就是另外一回事,这要看思路。


1. 在默认的Boot image中找到WinPE镜像路径(以32位为例子,我的环境我就只有一个32位WinPE,因为32位WinPE可以为 32位和64位Images部署,而64位只能部署64位Images )

SCCM:在OSD/WinPE中查询域信息的方案_第1张图片

2. 参考这个老外的网页。下载ADSI 5.0,添加ADSI,里面的readme够详细的了,照着操作没有错的。其中第三步可以不做,因为你可以在SCCM中的Boot Images的Optional Compoents中添加

http://deploymentresearch.com/Research/Post/331/ADSI-plugin-for-WinPE-5-0


 

3. 有了新的WinPE镜像之后,就要导入到SCCM中了,点击Add boot Image。微软的东西就是傻瓜,这个操作过程很简单我就不贴图了,添加好后记得添加驱动和Optional Compoents


4. 有了ADSI二楼脚本修改一下就可以运行了。

On Error Resume Next
Set oTaskSequence = CreateObject ("Microsoft.SMS.TSEnvironment")
If Err.Number<>0 Then WScript.Quit
Err.Clear
'输入用户名和密码,要查询的计算机名
sUser = "domain\user" 
sPassword = "Password" 
strcomputer ="PC_NAME"

Const ADS_SCOPE_SUBTREE = 2
Const ADS_SECURE_AUTHENTICATION = &H1 
Const ADS_SERVER_BIND = &H200
Dim objConnection, objCommand, objRecordSet 
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Properties("User ID") = sUser
objConnection.Properties("Password") = sPasswd
objConnection.Properties("Encrypt Password") = TRUE

objConnection.Properties("ADSI Flag") = ADS_SERVER_BIND Or ADS_SECURE_AUTHENTICATION
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
'指定DC服务器名字
objCommand.CommandText = "SELECT ADsPath FROM 'LDAP://DC_SERVER_NAME/dc=YourDomainName,dc=com' WHERE objectCategory='computer' AND Name='" & strcomputer & "'"
Set objRecordSet = objCommand.Execute 
'添加结果到SCCM OSD中的变量"IsDomainPC"
If Err.Number<>0 Then
 oTaskSequence ("IsDomainPC")="false" 
Else
 
 If objRecordSet.PageCount Then
  oTaskSequence ("IsDomainPC")="true"          
 Else   
  oTaskSequence ("IsDomainPC")="false"
 End If
End If


你可能感兴趣的:(WinPE,SCCM,ADSI)