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

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

我负责更改我的 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 脚本的服务器?我还将检查子网掩码并验证您是否在失败的客户端上启用了“文件和打印机共享”。

相关内容