2012-12-18 5 views
1

이 함수는 Windows Server 2003 및 2008 R2에서 실행되어야합니다. 명령 줄을 사용하여 줄 단위로 실행하려면 SUCCESSFULL! 스크립트에 의한 실행이 실패합니다.로컬 그룹에 사용자 추가

사용자를 로컬 그룹에 추가해야합니다.

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

"net localgroup"에도 실패 할 경우 다른 문제 (예 : powershell이 ​​아닌 것)가있는 것 같습니다. 스크립트를 실패의 가장 작은 부분까지 줄여야합니다. 또한 각 시스템에서 실행중인 버전 powershell은 무엇입니까? 어떤 버전이 실패합니까? 모든? 딱 하나만? – x0n

0

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

매개 변수 바인딩 또는 환경 적 범인? 그물 LOCALGROUP의 문제에 관해서는

: 더 코드가 제공되지 않기 때문에

The following exception occurred while retrieving member "Add"

Evidentally /add 플래그가 제대로은 회원의 이름으로 해석되고있다으로 설정되는 것이 아니라 :주의 오류 메시지를 검토 이유를 말할 수 없습니다.

+0

죄송합니다. 코드를 추가했습니다. 당신은 그것이 단지 하나의 라인이라고 말할 수 있으므로 그것이 필요하지 않다고 생각했습니다;) –

14

왜 PowerShell이 ​​당신을 위해 그것을 할 때 반사의 고통을 통해 가야합니까? 예 :

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

위의 내용은 로컬 Power Users 그룹에 SYSTEM 로컬 계정을 추가합니다. 왜 위의 특정 오류가 발생하는지 잘 모르겠습니다.이 단축 구문을 사용하여 얻을 수도 있습니다. 사용되는 특정 COM 인터페이스는 IADsGroup입니다 - 여기 참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa706021.aspx

참고 : 실제로 .NET 객체에 싸여 COM 객체를 소모하기 때문에,있는 모든 ADSI 개체에 Dispose 메소드를 호출하는 것이 좋습니다 당신이 그들과 함께 끝나면 만들었습니다.

+0

당신의 도움에 감사드립니다. 나는 모르지만 어떻게 든이 쉬운 해결책을 찾지 못했습니다. 그러나 나는 이미 그것을 시도했다 (다른 대답을 보라). 또한 스크립트에서 실패하지만 명령 행에서 실행될 때 작동합니다. –

1

관찰과 가정

는 코드를 기반으로 만들어진 가정의 몇 가지가 있습니다.

  1. 두 개의 값을 가진 하나의 매개 변수 개체 만 전달했습니다. Param
  2. 전화 기능을 사용하여 다른 addUser2Group의 -user 'MyGlobalMonitoringUser'-group "SomeDBGroup"
  3. 검증 전달 된 매개 변수. 적어도 빈/널 (null)인지 확인해야합니다.
  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" 
관련 문제