2012-02-01 3 views
2

MVC 3 컨트롤러에서 가장을 사용하여 Powershell cmdlet을 실행하려고하지만 "요청 된 레지스트리 액세스를 계속 허용하지 않습니다." 예외는() Runspace.Open를 호출 할 때Runspace 가장이있는 MVC 컨트롤러

StringBuilder stringBuilder = new StringBuilder(); 

RunspaceConfiguration rsConfig = RunspaceConfiguration.Create(); 

using (new Impersonator("username", "domain", "password")) 
{ 
    Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig); 

    runspace.Open(); 

    Pipeline pipeLine = runspace.CreatePipeline(); 

    string script = "get-process"; 
    pipeLine.Commands.AddScript(script); 

    Collection<PSObject> commandResults = pipeLine.Invoke();     

    foreach (PSObject obj in commandResults) 
    { 
     stringBuilder.AppendLine(obj.Properties["ProcessName"].Value.ToString()); 
    } 

디버깅 레지스트리 오류로 인해 레지스트리 키 읽기가 HKCU \ 환경에서 시도되기 보여줍니다. 가장을 사용하지 않고 위에서 실행하면 성공적으로 작동합니다.

참고 : 명의 도용 클래스는 여기에서 발견되었다 : 이런 일이 나 그것을 해결하기 위해 무엇을 할 수있는 이유에 http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/

어떤 아이디어?

UPDATE :

내가 가장 선 위의 Runspace.Open()를 이동하면 실행 영역이 필요한 레지스트리 데이터 (환경 변수)에 액세스 할 수 있도록이 실제로 도움 것이라고 추론 잠을 받고 후.

이제 코드가 기본 제공 cmdlet과 함께 제대로 작동하지만 "Microsoft.Exchange.Management.PowerShell.Admin"을로드하고 Exchange Cmdlet을로드하면 응용 프로그램이 중단됩니다.

+0

스크립트를 라이브러리로 다시 쓸 수없는 이유가 있습니까? 결국 더 쉽고 유지 보수가 쉬울 수 있습니다. – jrummell

+0

아이디어는 다른 명령이 사용된다는 것입니다. 위의 내용은 제가 수행하는 작업의 단순화 된 버전입니다. – ServerMonkey

+0

@ ServerMonkey - "응용 프로그램이 고장 나고 있습니다"라고 할 때 어떤 오류 메시지가 나타 납니까? 같은거야? – MrKWatkins

답변

1

성공! 이 경우에

여기에 내가이 일을하는 데 방법은 다른 사람에게 유용합니다

  1. Exchange 관리 도구를 설치
  2. 당신이에 대한 매개 변수를 추가 확인 최신 서비스 팩
  3. 적용 도메인 컨트롤러 (Microsoft - KB943937)