2014-05-22 54 views
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”,“code”部分。

我已经将它配对到一个简单的基本本地帐户创建脚本,并且此版本的工作原理如下:

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

然而,这并不工作,并产生以下问题:当检索成员 “创建” 发生

以下异常: “未知错误(0x80005000)” + CategoryInfo:NotSpecified:(:) [],ExtendedTypeSystemException + FullyQualifiedErrorId:CatchFromBaseGetMember + PSComputerName:SERVER

不能调用上一个空值表达的方法。 + CategoryInfo:InvalidOperation:(SetPassword:字符串)[],的RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull + PSComputerName:SERVER

不能调用方法上一个空值表达式。 + CategoryInfo:InvalidOperation:(SetInfo:字符串)[],RuntimeException的 + FullyQualifiedErrorId:InvokeMethodOnNull + PSComputerName:服务器

我“米居然不知道是怎么回事错误的创建方法似乎被接受其他多个脚本中,但是对于这一个时刻,我把这个变量到创建方法,它炸毁。

任何人都知道什么是问题呢?我越来越可笑沮丧。

回答

1

你要明白,每当你调用命令,你d不能访问本地变量(如$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 
} 
+0

哎呀,我想这可能是问题,但我认为新版本的PowerShell确实很好。非常感谢Bartek,我会试试看看我能否解决它。我明天更新。 –

+0

对于延迟应答的道歉。我已经验证你完全正确,需要添加一个Parameter来调用命令,然后使用参数列表进行封装。我已经验证了一个新的错误,那就是使用安全密码($ securepass)变量,它不会将正确的字符串传递给invoke命令。由于系统之间的切换,我怀疑这存在问题。 –

相关问题