2012-12-18 131 views
1

此功能應在Windows Server 2003和2008 R2上運行 使用命令行逐行執行它是SUCCESSFULL!腳本執行失敗。將用戶添加到本地組

function addUser2Group([string]$user,[string]$group) 
{  
    $cname = gc env:computername 
    $objUser = [ADSI]("WinNT://$user") 
    $objGroup = [ADSI]("WinNT://$cname/$group,group") 
    $members = $objGroup.PSBase.Invoke('Members') 
    $found = $false 

    foreach($m in $members) 
    { 
     if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user) 
     { 
      $found = $true 
     } 
    } 

    if(-not $found) 
    { 
     $objGroup.PSBase.Invoke('Add',$objUser.PSBase.Path) 
    } 

    $members = $objGroup.PSBase.Invoke('Members') 
    $found = $false 
    foreach($m in $members) 
    { 
     if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user) 
     { 
      $found = $true 
     } 
    } 

    return $found 
} 

addUser2Group('MyGlobalMonitoringUser',"SomeDBGroup") 

它應該將用戶添加到本地組。但它只是給了我以下錯誤:

Exception calling "Invoke" with "2" argument(s): "Unknown error (0x80005000)" 
+  $members = @($objGroup.PSBase.Invoke <<<< ("Members")) 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 





編輯:隨着出現錯誤消息/加是

The following exception occurred while retrieving member "Add": "Unknown error (0x80005000)" 


代碼是:

function addUser2Group([string]$user,[string]$group) 
{ 
    $cname = gc env:computername 
    try 
    { 
     ([adsi]"WinNT://$cname/$group,group").Add("WinNT://$cname/$user,user") 
    } 
    catch 
    { 
     write2log($_) 
     return $false 
    } 

    return $true 
} 
+1

您是否正在使用管理員權限運行腳本? –

+0

我使用管理員權限從CMD.exe運行它(因爲我總是必須取消限制和重新限制PowerShell腳本) –

+0

你是如何從cmd.exe調用它的?你使用的是什麼確切的命令行? – Goyuix

回答

2

爲什麼不使用net localgroup /add你的腳本,而不是所有那些討厭的WMI? PowerShell是一個外殼,而不是操作系統:)

+0

好主意,但沒有幫助。爲什麼我可以從命令行運行而不是從腳本運行?因爲正如我已經說過的......它的工作原理! 現在我會嘗試使用net local group + try..catch,但我仍然希望爲此答覆:> –

+0

net local group也會失敗。 BtW:使用acl設置權限也失敗。 是的,我相信我以管理員身份運行它! –

+0

聽起來像你有一個不同的問題(即不是PowerShell),那麼如果「網絡本地組」也失敗。你需要將你的腳本降低到最小程度的失敗再現。另外,你在每個系統上運行哪個版本的powershell?哪些版本失敗?所有?只有一個? – x0n

0

•0x80005000 ("The specified directory service attribute or value does not exist").

參數綁定或環境罪魁禍首可能?

至於與淨本地問題:檢查仔細的錯誤信息:

The following exception occurred while retrieving member "Add"

Evidentally的/add標誌沒有被正確設定,因爲它被解釋爲一個成員的名字,但由於沒有設置密碼,不能說爲什麼。

+0

對不起,我添加了代碼。你可以說這只是一條線,所以我不認爲這是需要的;) –

14

PowerShell爲什麼要經歷反思的痛苦?示例:

$group = [ADSI]"WinNT://./Power Users,group" 
$group.Add("WinNT://SYSTEM,user") 

上面將SYSTEM本地帳戶添加到本地Power Users組。我不知道爲什麼你會得到上面的具體錯誤,你也可以使用這個縮寫語法來獲得它。正在使用的特定COM接口是IADsGroup - 參考:http://msdn.microsoft.com/en-us/library/windows/desktop/aa706021.aspx

注意:因爲您實際上正在使用.NET對象中包裝的COM對象,所以最好在任何ADSI對象上調用Dispose方法當你完成它們時創建。

+0

感謝您的幫助。我不知道,但不知何故,我找不到這個簡單的解決方案。但我已經嘗試過了(請參閱其他答案)。它在腳本中也失敗,但是在從命令行執行時工作。 –

1

觀察和假設

有一對夫婦是基於代碼所做的假設。

  1. 您只傳遞了一個具有兩個值的參數對象。使用Param聲明
  2. 呼叫功能不同addUser2Group - 用戶 'MyGlobalMonitoringUser' -group 「SomeDBGroup」
  3. 驗證傳遞的參數。至少應該檢查它們是否爲空/空。
  4. 只有在腳本運行之前讓$ group變量賦值,這纔會起作用。

基於傳遞$ group變量值的不正確參數保持爲空的事實。然後它導致其餘的代碼失敗,總是返回$ False的值。


建議的解決方案

推薦閱讀: Simplify your PowerShell Script with Parameter Validation

包括在功能 改變你調用函數的方式帕拉姆 「開關」。

下面是一個可用的代碼的副本。

function addUser2Group 
{ 
    # Added the Param Switch 
    Param(
     [string]$user, 
     [string]$group 
    ) 

    $cname = gc env:computername 
    $objUser = [ADSI]("WinNT://$user") 
    $objGroup = [ADSI]("WinNT://$cname/$group,group") 
    #$members = $objGroup.Invoke('Members') 
    $found = $false 

    foreach($m in $members) 
    { 
     if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user) 
     { 
      $found = $true 
     } 
    } 

    if(-not $found) 
    { 
     $objGroup.PSBase.Invoke('Add',$objUser.PSBase.Path) 
    } 

    $members = $objGroup.PSBase.Invoke('Members') 
    $found = $false 
    foreach($m in $members) 
    { 
     if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user) 
     { 
      $found = $true 
     } 
    } 

    return $found 
} 

addUser2Group -user 'testing' -group "Administrators"