2017-10-13 18 views
-2

C#을 사용하여 원격 컴퓨터에서 서비스 목록을 가져 오려고하지만 작동하지 않지만 같은 사용자로 PowerShell 스크립트를 실행할 때도 동일하게 작동합니다.아래의 powershell 코드에 대한 C# 대안은 무엇입니까?

$global:websess = New-PSSession -Computername $webserverNameList.Text -Credential $global:cred -ConfigurationName *JEAconfigname* -Authentication Negotiate 

위의 코드는 원격 컴퓨터에서 서비스 목록을 가져 오는 데 동일한 domain \ username을 사용하는 PowerShell 스크립트의 코드입니다. ServiceController 클래스 및 ConnectionOption 클래스와 ManagementScope의 조합을 사용하여 C# 코드에서 동일한 작업을 시도했지만 액세스가 거부되었습니다.

 ConnectionOptions connection = new ConnectionOptions(); 
     connection.Username = "domain\username"; 
     connection.Password = "password"; 
     connection.Authority = ""; 
     connection.EnablePrivileges = true; 
     connection.Authentication = AuthenticationLevel.PacketPrivacy; 
     connection.Impersonation = ImpersonationLevel.Impersonate; 
     ManagementScope scope = new ManagementScope(@"\\" + lstServerNames.SelectedValue.ToString() + @"\root\cimv2"); 
     scope.Connect(); // Fails here: System.UnauthorizedAccessException: 'Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))' 
     ObjectQuery query = new ObjectQuery(
       "SELECT * FROM Win32_Service WHERE Name like '%Vend%'"); 

     ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(scope, query); 

     foreach (ManagementObject queryObj in searcher.Get()) 
     { 
      cmbServices.Add(queryObj["Name"].ToString()); 
     } 

나는이 너무 시도 :

List<ServiceController> serviceList = ServiceController.GetServices(lstServerNames.SelectedValue.ToString()).Where(x => x.ServiceName.ToLower().StartsWith("vend") || x.ServiceName.ToLower().StartsWith("vstsagent")).ToList(); 
// Fails here: System.InvalidOperationException: 'Cannot open Service Control Manager on computer '*server name*'. This operation might require other privileges.' 
     foreach (ServiceController service in serviceList) 
     { 
      cmbServices.Add(service.ServiceName); 
     } 

나는 사용자가 현재 관리자 액세스 권한을 부여한다 알고있다. 스크립트를 실행하기 위해 Just Enough Administration (JEA) 액세스 권한을 사용하는 기존 PowerShell. https://msdn.microsoft.com/en-us/library/dn896648.aspx

+0

[C# 내의 Microsoft Exchange PowerShell에 연결] (https://stackoverflow.com/questions/36236897/connect-to-microsoft-exchange-powershell-within-c-sharp)의 가능한 복제본입니다. 이 질문에 대한 답은 당신이하려는 일에 가깝게해야합니다. –

+0

오류가있는 C# 앱의 예제 코드를 보여주는 것은 어떻습니까? 작동 PoSh 예제를 공유하고 PowerShell에 도움을 요청하는 것은별로 의미가 없습니다 ... – Clijsters

+0

@Clijsters 코드 –

답변

0

잘못 사용하고 있습니다. ManagementScope constructor. 옵션을 지정하지 않았습니다.

시도 :

ManagementScope scope = new ManagementScope(@"\\" + lstServerNames.SelectedValue.ToString() + @"\root\cimv2", connection); 
scope.Connect(); 

도 위의 링크 된 문서의 예를 참조하십시오.

+0

을 업데이트했습니다. 코드를 업데이트하지 않아서 죄송합니다. 연결 옵션을 추가했지만 여전히 작동하지 않습니다. 문제는 로그인 한 사용자가 원격 서버에 액세스 할 수 있지만 서비스 등을로드 할 수 없다는 것입니다. PowerShell을 사용하면 JEA (Just Administration)라는 개념을 사용하여 작동합니다. 우리가 C#과 비슷한 것을 가지고 있다면 같은 방법으로 호출 할 수 있는지 궁금합니다. –