2017-10-13 12 views
-2

J'essaie d'obtenir une liste de services à partir d'une machine distante en utilisant C# mais cela ne fonctionne pas, mais c'est la même chose quand je lance le script PowerShell sous le même utilisateur.Quelle est l'alternative C# pour le code PowerShell ci-dessous?

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

Le code ci-dessus est à partir du script PowerShell qui utilise le même domaine \ nom d'utilisateur pour obtenir une liste de services à partir d'une machine distante. J'ai essayé de faire la même chose à partir de mon code C# en utilisant la classe ServiceController et aussi une combinaison de classe ConnectionOption et ManagementScope mais j'ai l'accès refusé erreur.

 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()); 
     } 

j'ai essayé cela aussi:

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); 
     } 

Je sais que l'utilisateur est maintenant donné l'accès admin. Le PowerShell existant utilisant l'accès JEA (Just Enough Administration) pour exécuter le script. https://msdn.microsoft.com/en-us/library/dn896648.aspx

+0

Copie possible de [Connexion à Microsoft Exchange PowerShell au sein de C#] (https://stackoverflow.com/questions/36236897/connect-to-microsoft-exchange-powershell-within-c-sharp). Les réponses à cette question devraient vous rapprocher de ce que vous essayez de faire. –

+0

Pourquoi ne pas afficher un exemple de code de l'application C# défaillante? n'a pas beaucoup de sens pour partager l'exemple de travail PoSh et demander de l'aide avec PowerShell ... – Clijsters

+0

@Clijsters J'ai mis à jour le code –

Répondre

0

Vous utilisez le mauvais ManagementScope constructor. Vous ne spécifiez pas les options.

Essayez:

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

Lire par exemple dans le document lié ci-dessus aussi.

+0

Je suis désolé, je n'ai pas mis à jour le code. J'avais ajouté les options de connexion, mais cela ne fonctionnera toujours pas. La chose est l'utilisateur connecté a accès au serveur distant, mais je ne peux pas l'obtenir pour charger les services et autres. Avec PowerShell, cela fonctionne en utilisant l'idée de JEA (juste assez d'administration). Je me demandais si nous avions quelque chose de similaire à C# donc je peux l'appeler de la même manière –