2014-05-22 26 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命令。由於系統之間的切換,我懷疑這存在問題。 –

相關問題