2016-09-23 2 views
0

상승 된 자격 증명을 사용하려면 이진 cmdlet을 작성 중이므로 PSCredential 매개 변수를 사용하고 싶습니다. 내가 찾을 수있는 모든 내가 원하는 바가 아니다, C#을에서 PowerShell cmdlet을 실행하는 방법입니다 -C# 코드에서 PSCredentials 사용

[Parameter] 
public PSCredential Credential { get; set; } 

이에 대한 문서의 별개의 부족이있는 것 같습니다.

직접 Windows 가장을 피하기 위해 SimpleImpersonation 너겟 패키지를 다운로드했습니다.

using (Impersonation.LogonUser("GLOBAL", "last.first", "mypassword", LogonType.Interactive)) 
{ 
    foreach (ServerInfo server in Targets) 
     ProcessRecord(); 
} 

제가 System.Security.Principal.WindowsIdentity.GetCurrent().Name를 검사 할 때, 사용자는 정확하지만 I가 명령을 실행할 때 (예 ServerManager.OpenRemote(computerName))는 I은 UnauthorizedAccessException을 받는다. 원하는 사용자로 실행되는 PowerShell 인스턴스에서이 코드를 실행하면 cmdlet가 완벽하게 실행됩니다.

어쨌든 PSCredential을 C# 바이너리 cmdlet에서 활용하는 방법에 대한 단서가 있습니까?

답변

1

왜 온라인 문서가 적은지 잘 모르겠습니다. 나는 이것을 달성하기 위해 가장을 사용해야 할 것으로 의심했다. 이것과 관련된 많은 배관이있는 것처럼 보입니다. see here.

더 많은 조사가 끝나면 SimpleImpersonation이라는 멋진 너겟 패키지가 있습니다.

사용 :

[Parameter] 
public PSCredential Credential { get; set; } 

내가이 작업을 수행 할 수 있습니다이 날 가장 된 사용자로 명령을 실행 할 수 있습니다

using (Impersonation.LogonUser("GLOBAL", Credential.UserName, Credential.Password, LogonType.Interactive)) 

. LogonUser()은 사용자 이름과 SecureString 암호를 사용합니다.

이 경우 ServiceController 호출에는 문제가 없지만 ServerManager은 여전히 ​​COM 권한이없는 예외를 throw합니다. 나는 OpenRemote()을 사용하지 않고 ctor 과부하를 사용한다고 말한 this post을 발견했습니다. 다음 코드가 작동합니다.

using (ServerManager serverManager = new ServerManager(@"\\server\c$\windows\system32\inetsrv\config\applicationHost.config")) 
{ 
    ApplicationPoolCollection appPool = serverManager.ApplicationPools; 
    Console.WriteLine(appPool.Count); 
}