【问题标题】:Adding local users to a group of servers将本地用户添加到一组服务器
【发布时间】:2014-05-23 13:15:29
【问题描述】:

这里可能是一个独特的问题。我有一堆服务器需要添加新的本地用户帐户。

我以为我已经通过以下命令找到了答案:

# Create new local Admin user for script purposes
$date = Get-Date -Format yyyy-MM-dd
$servers = get-content serverlist.txt

$username = read-host -Prompt "Enter Username"
$securepass = read-host -Prompt "Enter Password" -AsSecureString

foreach ($server in $servers)
{
    Invoke-command -ComputerName $server
    {
        $Computer = [ADSI]"WinNT://localhost"
        $LocalAdmin = $Computer.Create("User", "$username")
        $LocalAdmin.SetPassword("$securepass")
        $LocalAdmin.UserFlags = 64 + 65536 # ADS_UF_PASSWD_CANT_CHANGE + ADS_UF_DONT_EXPIRE_PASSWD
        $LocalAdmin.SetInfo()
    }
}

但是,当我运行此代码时,会出现一些不同的错误。看来问题出在代码的“$Computer.Create("User"," 部分。

我实际上已经将它与一个简单的基本本地帐户创建脚本配对,并且这个版本可以工作:

invoke-command -computername <server> {[ADSI]$server="WinNT://localhost";$HD=$server.Create("User","TESTUSER");$HD.SetPassword("PASSWORD");$HD.SetInfo()}

现在该版本可以正常工作,因为它能够设置用户并使用引用的文本创建密码。所以我继续设置带有提示的变量,为我们提供一种自动化新用户创建过程的方法。

所以我转向了这个更自动化的版本:

$date = Get-Date -Format yyyy-MM-dd
$username = read-host -Prompt "Enter Username"
$securepass = read-host -Prompt "Enter Password"
$server1 = "SERVER"
Invoke-command -computername $server1 {
        [ADSI]$server=("WinNT://localhost/")
        $HD=$server.Create("User",$username)        
        $HD.SetPassword($securepass)
        $HD.SetInfo()
        }

但这不起作用并产生以下问题:

检索成员“Create”时发生以下异常:“未知错误 (0x80005000)” + CategoryInfo : NotSpecified: (:) [], ExtendedTypeSystemException + FullyQualifiedErrorId : CatchFromBaseGetMember + PSComputerName : SERVER

您不能在空值表达式上调用方法。 + CategoryInfo : InvalidOperation: (SetPassword:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull + PSComputerName : SERVER

您不能在空值表达式上调用方法。 + CategoryInfo : InvalidOperation: (SetInfo:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull + PSComputerName : SERVER

我实际上不确定这里出了什么问题。create 方法似乎在 MULTIPLE 其他脚本中被接受,但是对于这个我将变量放入 create 方法的那一刻,它爆炸了。

有人知道怎么回事吗?我变得可笑的沮丧。

【问题讨论】:

    标签: powershell-3.0


    【解决方案1】:

    您需要了解,无论何时 Invoke-Command,您都无法访问局部变量(例如 $username)。

    在 PowerShell v3 中有两种解决方法。

    更简单,带有$using: 前缀:

    $username = 'foo'
    Invoke-Command -ComputerName Test { $using:username }
    

    更复杂,但也适用于 v2,带有 param() 块和 -ArgumentList 参数:

    $username = 'foo'
    Invoke-Command -ComputerName Test -ArgumentList $username {
        param ($user)
        $user
    }
    

    【讨论】:

    • Argh,我认为这可能是问题所在,但我确信使用较新版本的 powershell 就可以了。非常感谢Bartek,我试试看能不能解决。我明天更新。
    • 对延迟回复表示歉意。我已经验证你是完全正确的,它需要在调用命令中添加一个参数,然后用参数列表封装。我已经验证了一个新错误,那就是安全密码 ($securepass) 变量,它没有将正确的字符串传递给调用命令。我怀疑这是由于系统之间的切换而导致的问题。
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多