web-dev-qa-db-fra.com

PowerShell Add-WindowsFeature non reconnu

Merci tout d’abord d’avoir passé cela en revue.

J'ai essentiellement un logiciel agent tiers qui me permet d'exécuter PowerShell en tant que LocalSystem. Cela me permet d’exécuter facilement des commandes PowerShell distantes sans WinRM, etc.

Le problème que je rencontre est que, sur certains serveurs, je ne parviens pas à exécuter get-WindowsFeature ou Add-WindowsFeature.

Voici un exemple de la façon dont j'essaie de réaliser cela:

Import-Module ServerManager;
Get-WindowsFeature;

La sortie est comme telle:

The term 'Get-WindowsFeature' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Si je tape ces mêmes commandes dans une fenêtre PowerShell ou si j'appelle directement PowerShell.exe, le résultat est renvoyé. J'essaie de comprendre ce que nous ne faisons pas correctement dans l'application, mais je suis la personne la plus familière avec PowerShell ici. 

Dois-je faire quelque chose de spécial pour charger ces applets de commande? Get-Module ne montre rien, curieusement.

Je vous remercie!


En réponse à JBSmith:

Yessir - ressemble à 2.0. Voici les résultats des commandes que vous avez mentionnées

>Name                           Value                                            
>----                           -----                                            
>CLRVersion                     2.0.50727.6407                                   
>BuildVersion                   6.1.7600.16385                                   
>PSVersion                      2.0                                              
>WSManStackVersion              2.0                                              
>PSCompatibleVersions           {1.0, 2.0}                                       
>SerializationVersion           1.1.0.1                                          
>PSRemotingProtocolVersion      2.1                                              
>
>Name : AppLocker
>Name : Appx
>Name : BestPractices
>Name : BitsTransfer
>Name : BranchCache
>Name : CimCmdlets
>Name : DirectAccessClientComponents
>Name : Dism
>Name : DnsClient
>Name : International
>Name : iSCSI
>Name : IscsiTarget
>Name : ISE
>Name : Kds
>Name : Microsoft.PowerShell.Diagnostics
>Name : Microsoft.PowerShell.Host
>Name : Microsoft.PowerShell.Management
>Name : Microsoft.PowerShell.Security
>Name : Microsoft.PowerShell.Utility
>Name : Microsoft.WSMan.Management
>Name : MMAgent
>Name : MsDtc
>Name : NetAdapter
>Name : NetConnection
>Name : NetLbfo
>Name : NetQos
>Name : NetSecurity
>Name : NetSwitchTeam
>Name : NetTCPIP
>Name : NetworkConnectivityStatus
>Name : NetworkTransition
>Name : MSFT_NfsMappedIdentity
>Name : NFS
>Name : PKI
>Name : PrintManagement
>Name : PSDiagnostics
>Name : PSScheduledJob
>Name : PSWorkflow
>Name : PSWorkflowUtility
>Name : RemoteDesktop
>Name : ScheduledTasks
>Name : SecureBoot
>Name : ServerCore
>Name : ServerManager
>Name : ServerManagerTasks
>Name : SmbShare
>Name : SmbWitness
>Name : Storage
>Name : TroubleshootingPack
>Name : TrustedPlatformModule
>Name : UserAccessLogging
>Name : VpnClient
>Name : Wdac
>Name : Whea
>Name : WindowsDeveloperLicense
>Name : WindowsErrorReporting
>Name : AWSPowerShell

J'ai aussi remarqué que GCM | ? {$ _. ModuleName -eq 'ServerManager'} ne renvoie rien lorsque je l'exécute, mais via une fenêtre PS normale, il renvoie une liste de commandes comme prévu.

12
BeastianSTi

Le problème a fini par être que les métadonnées de ServerManager étaient 3.0 sur ces serveurs, mais l'exécutable développé pour appeler des commandes PowerShell n'était que la version 2.0. Lorsqu’il a essayé d’importer les modules, des erreurs de schéma concernant les métadonnées ont été renvoyées, mais le fichier EXE ne les a pas redirigées vers stdout, d’où aucune réponse.

Import-Module : The 'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ServerM
anager\ServerManager.psd1' module cannot be imported because its manifest conta
ins one or more members that are not valid. The valid manifest members are ('Mo
duleToProcess', 'NestedModules', 'GUID', 'Author', 'CompanyName', 'Copyright',
'ModuleVersion', 'Description', 'PowerShellVersion', 'PowerShellHostName', 'Pow
erShellHostVersion', 'CLRVersion', 'DotNetFrameworkVersion', 'ProcessorArchitec
ture', 'RequiredModules', 'TypesToProcess', 'FormatsToProcess', 'ScriptsToProce
ss', 'PrivateData', 'RequiredAssemblies', 'ModuleList', 'FileList', 'FunctionsT
oExport', 'VariablesToExport', 'AliasesToExport', 'CmdletsToExport'). Remove th
e members that are not valid ('HelpInfoUri', 'RootModule'), then try to import
the module again.
At line:1 char:14
+ Import-Module <<<<  ServerManager; Get-Module
    + CategoryInfo          : InvalidData: (C:\Windows\syst...verManager.psd1:
   String) [Import-Module], InvalidOperationException
    + FullyQualifiedErrorId : Modules_InvalidManifestMember,Microsoft.PowerShe
   ll.Commands.ImportModuleCommand
0
BeastianSTi

Cela est probablement dû au fait que le script PowerShell est lancé à partir d'une instance 32 bits de PowerShell. Les commandes ServerManager ne sont disponibles qu'à partir de la version 64 bits de PowerShell. Voir: Impossible d'accéder au module ServerManager via PowerShell

--Edit - Pour ajouter aux commentaires de jbsmith ---

Extra choses à essayer:

Lorsque vous avez exécuté le cmdlt Get-Command:

gcm | ? { $_.ModuleName -eq 'ServerManager' }

Il ne retournera rien car le module ServerManager n'a pas été chargé.

Essayez d'exécuter ceci à la place. Il listera tous les modules disponibles à charger:

Get-Module -ListAvailable | ? { $_.Name -eq 'ServerManager' }

L'autre chose à essayer est d'utiliser l'option "Force" (réimporte un module et ses membres, même si le module ou ses membres disposent d'un mode d'accès en lecture seule):

Import-Module ServerManager -Force;
Get-WindowsFeature;
8
HAL9256