将本地用户添加到一组服务器

时间:2014-05-22 22:29:50

标签: powershell-v3.0

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

我以为我用以下命令找到了答案:

# 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()
        }

然而,这不起作用并产生以下问题:

  

检索成员时出现以下异常&#34;创建&#34;:&#34;未知错误(0x80005000)&#34;      + 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

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

有人知道哪里出错了?我变得非常沮丧。

1 个答案:

答案 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
}