Tag: PowerCLI

  • How to Fix “PowerCLI Command Found but Module Could Not Be Loaded” in PowerShell

    How to Fix PowerShell VMware Errors: Assertion Failure and Connect-VIServer Module Issues

    When working with VMware PowerCLI in PowerShell, you may encounter error messages that prevent you from connecting to a vCenter Server or ESXi host. Two common errors include:

    • “An assertion failure has occurred.”
    • “The ‘Connect-VIServer’ command was found in the module ‘VMware.VimAutomation.Core’, but the module could not be loaded.”

    These errors usually indicate issues with PowerShell module permissions, blocked files, or Group Policy restrictions. Below are the most common causes and their proven solutions.


    Common Causes and Solutions

    A. VMware PowerCLI Module Files Are Set to Read-Only

    If PowerCLI module files or folders are marked as read-only, PowerShell may fail to load them correctly.

    How to fix:

    1. Navigate to your PowerShell Modules directory (for example:
      C:\Program Files\WindowsPowerShell\Modules)
    2. Select all VMware-related folders starting with vmware*.
    3. Right‑click and choose Properties.
    4. Enable Read-only, apply the setting to all subfolders and files, and click OK.
    5. Reopen Properties, uncheck Read-only, and apply again.

    This reset helps clear inconsistent file attribute states.


    B. VMware PowerCLI Module Files Are Blocked by Windows

    Files downloaded from the internet or copied from another machine may be blocked by Windows for security reasons, preventing PowerShell from loading the module.

    How to fix:

    Run the following command in an elevated PowerShell session:

      Get-ChildItem "Module Path" -Recurse | Unblock-File
      PowerShell

      Replace "Module Path" with the actual path where the VMware PowerCLI modules are installed.

      This command removes the “blocked” flag from all files in the module directory.


      C. Group Policy Restricts Script Execution

      In some corporate environments, Group Policy (GPO) allows only signed PowerShell scripts to execute.

      This can block PowerCLI modules from loading.

      How to fix:

      • Verify the current execution policy: PowerShellGet-ExecutionPolicy -List
      • Work with your IT security team to figure out a solution.

      Aligning PowerShell execution policy with security standards is essential in enterprise environments.

    1. Validating Connection Result of Connect-VIServer

      Validating connection result of Connect-VIServer is trick since VMware doesn’t use the standard way of throwing errors.

      There are different error messages for different scenarios. We can leverage “Try Catch Finally” of PowerShell to testing connection result and output customized errors.

      The essential format of testing vCenter connection is below. PowerShell cannot catch error message if you don’t add “-ErrorAction Stop” when connect vCenter.

      try{
          connect-viserver vcenter-xxxx -ErrorAction Stop
      }
      catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidLogin]{
          Write-Host "Permission issue"
      }
      catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.ViServerConnectionException]{
          Write-Host "Cannot connect to vCenter Server"
      }
      catch
          {Write-Host "Other issue"}
      finally{
          write-host "the end."
      }

      How to know error types of the validating connection result?

      You probably have question how did I know which error types are for what? I used a very simple way that just give it a try. 🙂

      # Simulating connection error
      Connect-VIServer vCenter.zhengwu.org -User "xxx" -Password "yyy"
      
      # Format output of $Error. $Error stores output of errors in PowerShell.
      $error[0] | fl * -force
      
      # You will see similar lines below
      writeErrorStream      : True
      PSMessageDetails      :
      Exception             : VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidLogin: 7/29/2019 9:27:30 AM   Connect-VIServer                Cannot complete login due to an
                              incorrect user name or password.         ---> VMware.Vim.VimException: Cannot complete login due to an incorrect user name or password. --->
                              System.ServiceModel.FaultException`1[VimApi_67.InvalidLogin]: Cannot complete login due to an incorrect user name or password.
      

      VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidLogin is the error type we want to find.

      Conclusion

      This is very simple way to validating connection result of Connect-VIServer. Looks like the result errors coming from different assemblies. For example, connection error is VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.ViServerConnectionException. It’s hard to find out all possible errors. I’m looking for a official document but no lucky. Please let me know if you know where I can reference.

    2. How To Find Non-tagged ESXi Hosts

      There are plenty of scripts to find tagged ESXi hosts. But what if you want to find out all ESXi hosts not be tagged? Following is a simple script:

      Compare-Object ((Get-VMHost | Get-TagAssignment).Entity | select -uniq) (Get-VMHost)

      The output is similar like following:

      InputObject      SideIndicator
      -----------      -------------
      esx1         =>  
      esx2         =>  
      esx3         =>

      The => indicates ESXi hosts in InputObject are not tagged.

      If return is nothing, it means all ESXi hosts are tagged.

      Please refer to “Using the Compare-Object Cmdlet” for detail.

    3. Automatic vSphere Capacity Report in PPT

      Reporting is important to management. To be a IT Pro, you may need to run regular reports for management. Some reports may be generated time consume. vRealize Operations Manager is an alternative to create customized reports. It’s a powerful product to organize data and create PDF or CSV files on scheduled intervals. I recommend have a look if you have planned to implement performance, capacity and alarm system for virtual environment.

      What if budget is constrained? Is there a way to create such kind of reports? The answer is “Yes”. I worked out an automatic workflow to create the reports. I will not provide step-by-step guide in this post since it’s advanced integration of multiple products, everyone may have different way to do that. You can even create everything by script if you have strong programming skill. I’m not, I only look for the easiest way to achieve the goal.

      Here is a scenario for  example: I want to run a monthly report for vSphere CPU and memory count and present to management by PowerPoint. I want to show management the historical trend of CPU and memory data. The traditional way is collect data in vCenter, organize and create charts in PowerPoint slides. So the whole workflow is: vCenter -> PowerPoint

      If you want to automate the whole process you need to introduce few things more: PowerCLI, CSV and Excel. You need to develop a PowerCLI script to grab CPU and memory data on vCenter Server, then export the data to a CSV table by PowerShell command export-csv. Then import the table to an Excel file by Office feature Query Data. It loads the CSV table dynamically, you can even specific what data can be queried by filter.

      Once the table is present in Excel, you need to create a chart accordingly. It’s trick when you paste the chart to PowerPoint Slide. You need to use Paste Special to paste the chart as Microsoft Excel Chart Object. The pasted chart can be updated automatically when you open the PowerPoint file.

      The last step is created a scheduled task to run the PowerCLI script. Make sure you read my blog Extremely slow when run PowerShell script by scheduled tasks before create the task.

      You can also configure the Excel file to automatically update table by CSV file.

    4. How to Integrate PowerCLI 6.5 with PowerShell and PowerShell ISE

      I wrote an article to introducing how to integrate PowerCLI with PowerShell and PowerShell ISE. VMware just released PowerCLI 6.5 R1, it includes lot  of new features and modules. And somehow my way doesn’t work. Following is new way to integrate PowerCLI 6.5 with PowerShell and PowerShell ISE in Windows 10.

      PowerShell and PowerShell ISE both have it own $profile. So we need to do two times.

      Before we start

      Please make sure your PowerShell execution policy is not restricted. You can get the setting by run  following command:

      Get-ExecutionPolicy

      PowerShell Integration

      1. Open PowerShell window. Run following command to confirm profile file is not existing.
        Test-Path $profile

        If return is ‘False’, go to step 2.
        If return is ‘True’, Backup the file and go to step 3.

      2. Run following command if the  profile file  doesn’t existing.
        New-Item -Path $profile -type file -force | Out-Null
        
        Test-Path $profile

        The return above should be ‘True’. Profile file is created.

      3. Run following command to include VMware PowerCLI modules in  PowerShell.
        Add-Content -Path $profile -value "# Load Windows PowerShell cmdlets for managing vSphere `r`n. 'C:Program Files (x86)VMwareInfrastructurePowerCLIScriptsInitialize-PowerCLIEnvironment.ps1'"

        The blue text above maybe different in your environment base upon where your PowerCLI is installed.

      PowerShell ISE Integration

      PowerShell ISE process is same to PowerShell, only different is all the operation should be completed in PowerShell ISE window.

      Reboot is not required in my environment. But anyhow please reboot if you see any issue.

      The processes above integrate PowerCLI 6.5 with PowerCLI and PowerCLI ISE for  current user only. If you want to integrate for all users on the machine, you need to refer to this article.

    5. 格式化PowerCLI输出

      今天抓Snapshot快照大小时发现输出值太长了,类似这张图。

      070416_0556_FormattingO1.png

      (more…)

    6. 整合PowerCLI与PowerShell

      早先我有写一篇文章关于如何手工整合PowerCLI和PowerShell。最近重装了系统,不得不再做一次。以前我习惯用PowerGUI写脚本,但不知道怎么搞的PowerGUI总是丢失菜单界面,这困扰了我很久一直没办法完全解决,所以这次我在想能不能把PowerCLI和PowerShell整合了一劳永逸,毕竟内置的好用一些啊。

      (more…)

    7. 如何使用PowerCLI获取物理RDM LUN的路径选择策略

      获取RDM磁盘信息是一件很磨人的事儿,如果你很仔细你就需要把每台都检查一遍以确保信息是一致的。研究出来两行命令,可以批量获取RDM磁盘信息。

      (more…)

    8. How to Get Path Selection Policy of Physical RDM LUN by PowerCLI

      It’s frustration to check RDM information, you have to check across  all ESXi hosts to make sure configuration is aligned. I just figured out two line commands to get path selection policy (aka PSP).

      (more…)

    9. How to Automate Snapshot on Virtual Machine

      I always treat virtual machine snapshots like a big risk. It caused several outages in our infrastructure. Please check out Best practices for virtual machine snapshots in the VMware to understand how it impacts production.

      虚拟机快照对我来说绝对是个大威胁,已经在我的生产环境里发生过好几次由此引发的故障了。如果你要了解快照对生产环境的影响可以看看:Best practices for virtual machine snapshots in the VMware

      (more…)