我负责更改我的 16,000 台服务器环境中的本地管理员帐户密码;我编写了一个 PowerShell 脚本,但花费的时间太长,因此我使用 powershell 运行空间工厂添加了多线程,将 16,000 个服务器分解为可管理的部分。
错误率约为 5%(约 800 台服务器);其中,75-100 个是可以排除故障的明显错误(未找到用户名、拒绝访问等),700-725 个会收到错误消息“未找到网络路径”。
但是,ping 服务器会得到响应,服务器工程师告诉我它们可以运行,我可以访问,并且 PowerShell 和 WMI 都在运行并正常运行。
我不知道从哪里开始排除故障。这是我使用的逻辑和代码:
我使用 FQDN,但是我公司的 DNS 中列出的服务器往往与 FQDN 不同,并且这两个选项无法相互解析。因此 servera.production.active.directory 不会解析为 servera.mycompany.com。此函数确定用于连接和设置密码的有效 FQDN,并返回有效 FQDN 或空字符串:
function get-validfqdn([string]$server, [string]$domain){
$fqdn = $server + "." + (get_FQDN $domain)
$altdn = $server + ".mycompany.com"
if(Test-Connection -count 1 -computer $fqdn -quiet -TimeToLive 80){
$valid = $fqdn
}
elseif{
$valid = $altdn
}else{
$valid = ""
return $valid
}
我尝试使用以下代码执行密码更改,该代码嵌入在模块中并对我们正在处理的列表中的每个服务器执行(由于 PowerShell 运行空间工厂代码,这是一个很长的函数)。
function Set-ServerPass([string]$filepath){
$servers = Import-CSV $filepath
$results = @()
foreach($server in $servers){
$svr = $server.Server
$password = $server.Password
$domain = $server.domain
$fqdn = get-validfqdn $svr $domain
if ($fqdn -ne ""){
Try{
$admin = [adsi]("WinNT://$fqdn/Administrator, user")
$admin.psbase.invoke("SetPassword", "$password")
$result.Error_Code = "0"
$result.Error_Msg = "The operation was sucessful"
}Catch{
$error_msg = Trim_ExceptionMessage $_.exception.Message
$result.Error_Code = "1"
$result.Error_Msg = $error_msg
$results += $result
}
}else{
$result.Error_Code = "51"
$result.Error_Msg = "The remote computer is not available"
}
}
return $results
}
注意:测试连接会过滤掉那些原本不可用的服务器;此功能的超时默认为~180 秒(3 分钟 x 1600 台服务器 = 太长)。
此代码在 95% 的服务器上均能正常工作,并且在运行此脚本一年后报告准确无误。然而,服务器工程师开始质疑此脚本是否有效,因为当我报告问题时,他们不明白为什么我会收到“未找到网络路径”错误,而他们的所有测试都表明它运行正常。
迄今为止的故障排除步骤:
- 在不同的计算机上运行
- 以不同的管理员身份运行
- 在一天中的不同时间运行 - 这是为了防止可能的服务器活动中断脚本(应用程序修补、重启等)
在过去的两个月里,我手动排除了 800 台服务器的故障,仅在发生故障的服务器上就运行了脚本约 15 次。重新运行后,我又重置了大约 10-300 个密码,但并没有发现所有密码,而且情况非常不稳定。
服务器工程师有 3 次报告没有问题,我重新运行了脚本,并且所有脚本都重置并且没有任何错误。
所以我的问题是:什么可能导致错误,我应该查看什么来确定根本原因?服务器上的设置?我的工作站上的设置?
设置如下:Windows XP Pro SP3。服务器是 Windows Server 2003 或 Windows Server 2008 R2。这些错误在两个服务器操作系统上都发生。
答案1
在客户端计算机上运行 WireShark,在脚本运行时记录所有网络流量。
这将会是大量的数据,但考虑到您正在讨论在 800 台服务器上手动运行它,情况不会比这更糟糕。
查找失败的 DNS 解析,并比较正常运行的服务器和失败的服务器。
WMI 支持日志记录、错误和调试信息。它可能在客户端或某些出现故障的服务器上很有用:http://blogs.technet.com/b/askperf/archive/2008/03/04/wmi-debug-logging.aspx
答案2
您是否检查过 Windows 防火墙或第三方防火墙软件,以确认它已被禁用或允许访问运行 Powershell 脚本的服务器?我还将检查子网掩码并验证您是否在失败的客户端上启用了“文件和打印机共享”。