PowerShell重置本地pipe理员帐户密码。 5%的失败

我有责任在我的16,000台服务器的环境中更改本地pipe理员帐户密码; 我写了一个PowerShell脚本,但花了太长时间,所以我使用powershell runspace工厂添加了multithreading,将16,000个分解成可pipe理的部分。

有大约5%的错误率(约800台服务器)。 其中,75-100是明确的错误,可能会麻烦(用户名未find,访问被拒绝等),700-725得到错误消息“networkingpath未find”。

然而,ping服务器得到响应,服务器工程师告诉我他们正在运行,我有权访问,PowerShell和WMI都在运行。

我不知道从哪里开始排除故障。 这里是我使用的逻辑和代码:

我使用FQDN,但是我的公司往往会将服务器在DNS中以不同的方式列出到他们的FQDN,并且这两个select将不会彼此解决。 所以servera.production.active.directory将不会parsing到servera.mycompany.com。 此函数确定用于连接和设置密码的有效FQDN,并返回有效的FQDN或空string:

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 } 

我尝试使用以下代码执行密码更改,embedded在模块中,并针对正在处理的列表中的每个服务器执行(由于PowerShell运行空间工厂代码,这是一个很长的function)。

 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 } 

注意:testing连接过滤掉否则将不可用的服务器; 此function的超时时间默认约为180秒(3分钟x 1600服务器=太长)。

此代码在95%的服务器上工作,并在运行该脚本一年后准确报告。 然而,服务器工程师开始质疑这个脚本是否工作,因为当我报告问题时,他们没有看到如何或为什么我会得到“networkingpath没有find”的错误,当他们所有的testing说,它工作正常。

目前为止的故障排除步

  • 在不同的电脑上运行
  • 以不同的pipe理员运行
  • 在一天的不同时间运行 – 这是为了防止可能的服务器活动中断脚本(应用程序修补,重新启动等)

在过去的2个月中,我手动麻烦了800台服务器,并在发生故障的服务器上运行了15次脚本。 重新运行networking我约10-300多个密码被重置,但没有抓住所有这些,这是非常不一致的。

在3次服务器工程师报告没有问题,我重新运行脚本,并重置所有没有错误。

所以我的问题是:什么可能导致错误,我应该看什么来确定根本原因? 服务器上的设置? 我的工作站上的设置?

安装如下:Windows XP专业版SP3。 服务器是Windows Server 2003或Windows Server 2008 R2。 这两个服务器操作系统上发生这些错误。

在客户端计算机上运行WireShark,在脚本运行时logging所有的networkingstream量。

这将是大量的数据,但是鉴于你正在谈论的是在800台服务器上手动运行它,这不会比这更糟糕。

查找失败的DNSparsing,查看比较工作的服务器和失败的服务器。

WMI支持日志logging,错误和debugging信息。 它可能对客户端或某些失败的服务器有用: http : //blogs.technet.com/b/askperf/archive/2008/03/04/wmi-debug-logging.aspx

您是否检查过Windows防火墙或第三方防火墙软件以确认其已禁用或允许访问运行Powershell脚本的服务器? 我也会检查子网掩码,并确认你在失败的客户端上启用了“文件和打印机共享”。