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
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. –
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
@Clijsters J'ai mis à jour le code –