Flings
Apps and tools built by our engineers that are intended to be played with and explored.

WebCommander

WebCommander

Summary

****** WebCommander is now open source! To get the download or source code, go to the WebCommader project page. ******

New features of 4.0 (Available here:  WebCommader project page.)

  •  Filter commands via categories
  • Allow static commands without parameters
  • Allow using the output of former commands as the input of latter commands in workflow
  • View source code directly
  • Allow using Windows Authentication to authenticate users
  • Allow using HTTPS
  • More commands (include one to install webcommander)
  • UI enhancements
  • Provide setup.ps1 to install, config and upgrade webcommander (could not install PowerCLI for external users)

For more detailed information, also see WebCommander goes Open Source!

Have you ever wanted to give your users access to certain virtual infrastructure tasks instead of the entire vCenter Client?

WebCommander is a way to do this! WebCommander was designed as a framework to wrap your PowerShell and PowerCLI scripts into an easy-to-access web service. Now you can hand off the tasks your users need by simply adding a new script and giving them access to WebCommander.

Click image to enlarge.
webCommandefrontpage

System Requirements

  • Windows 2008 or 2012
  • Powershell v3 or v4
  • vSphere PowerCLI
  • IIS 8
  • PHP 5

Video

Change Log

What's new in 3.0:

1. New UI style
2. Enchanced workflow UI controls
3. Embedded workflow (by running a workflow as a command)
4. A bunch of new and enhanced commands

Engineers

Marian Shen

Desktop QE

Jerry Liu

Desktop QE

Sabrina Hou

Desktop QE

Zhi Lin

Desktop QE

Brian Yu

Desktop QE

Yolkfull Zhou

Desktop QE

Ting Liu

Desktop QE

Alan Renouf

Infrastructure Product Marketing
Add Comment

165 thoughts on “WebCommander

  1. Mike

    Is there a way to have the site run as an admin service account (essentially impersonating the user to run scripts) yet still log the non-privileged user that clicked the Run button?

    We want system administrators to be able to run all the scripts under their non-privileged account without having to enter an admin username/password everytime they execute one of the scripts. For us, logging is the most important part. So, as long as it can log who clicked what, that’s all we need.

    If we set the site to “connectas” a service account, it logs everything as the service account instead of the actual user that was clicking the button. So, it’d be really nice to use IIS Windows Authentication, so they don’t have to enter any username/password to get to the webcommander site and never need to enter additional creds to run the scripts.

    Thanks!

    Reply
    1. Jerry Liu

      Logging is very simple actually. Have a look at the showHistory command. All execution records are stored under www/history/username

      Windows authentication could be enabled in IIS. The installation wiki on github describes how.

      Once you choose windows aunthentication, you could authorize read and execute rights of powershell scripts to users. Non authorized user could not see the commands at all.

      It sounds you also want to use the user credential automatically for vSphere and remote machine. This is not supported currently. I will do some homework on it and come back to you later.

      Reply
      1. Mike

        Hi Jerry,

        Thanks for the reply. We actually know about the webCommander logging, which is great, and we were using the Windows Authentication in IIS already. We also enabled Script Execute under Handler Mappings. We also tried giving the users’ fullcontrol on the c:\webcommander folder. But we still have issues.

        Our issue is that in order for any scripts to run and logging to work on a per-user basis, we’ve had to make every user a member of the Administrators local group on the web server. The only other choice seems to be requiring that the user enter an admin username/password as a parameter field on each script, which isn’t as efficient as we’d like. If they don’t have admin access to the server, all scripts without parameters for username/password return “AuthorizationManager check failed.”

        Thank you very much for your assistance!

        -Mike

        Reply
        1. Jerry Liu

          Hi Mike,
          I assume all users have their own AD accounts. If webcommander server is a member server in AD, you don’t need to create a local account for each user.

          Let’s say if a user is known as domain\user1 and he is in group domain\group1. If you want all users in that group could run scripts under \powershell\function1\, just change security settings of the folder to give read$execute permission to domain\group1.

          Let me know if this is feasible for your scenario.

          Reply
          1. Mike

            Hi Jerry,

            Yes, all users have domain accounts and the server is a member server. All users access the site with their domain user account. We weren’t creating local accounts on the server. I was only referring to the local Administrators group on the server.

            We have already tried giving the domain user and domain group Read/Execute on the “c:\webcommander” folder and all subfolders, which is where the web folder exists. We even tried giving the domain user and domain group FullControl of the “c:\webcommander” folder and all sub-folders, but they still get the error “AuthorizationManager check failed” in the Result window on the page.

            However, if I add the domain user or domain group as a member of the member server’s local Administrator group, they can run all scripts without error. But that gives the domain user too much access to the server.

            It seems clear that it is just a permissions issue, but we are missing something. We are running Windows 2012 R2 with IIS 8.5.

            Thank you,

            -Mike

            Reply
            1. Jerry Liu

              What’s the identity of webcommander application pool?
              In IIS, highlight Application Pools and select the one of webcommander.
              Open the Advanced Settings dialog and locate Identity.
              To use Windows Authentication, we need to set it to ApplicationPoolIdentity.

              Let me know if this solves your problem.

              Reply
  2. Edi

    Hi, running “setup.ps1″ in the“install” folder I become the following error:

    PowerCLI C:UsersAdministratorDownloadswebcommander-masterwebcommander-maste
    rpowershellInstall> .setup.ps1
    Downloading PowerCLI, WPI and Advanced Logging…
    PowerCLI, WPI and Advanced Logging downloaded successfully.
    Downloading WebCommander package…
    WebCommander package downloaded successfully
    IIS is already installed.
    Web Platform Installer is already installed.
    PowerCLI is already installed.
    PHP is already installed.
    Extracting WebCommander package…
    WebCommander package extracted successfully.
    Stopped all existing websites.
    Creating WebCommander website…
    WebCommander website created successfully.
    Configuring website authentication…
    Windows authentication is enabled.
    IIS Advanced Logging is already installed.
    Configuring IIS Advanced Logging…
    Add-WebConfiguration : Filename:
    Error: Cannot add duplicate collection entry of type ‘field’ with unique key
    attribute ‘id’ set to ‘url’
    At C:UsersAdministratorDownloadswebcommander-masterwebcommander-masterpow
    ershellInstallsetup.ps1:254 char:16
    + $definition | Add-WebConfiguration “$filter/fields” | out-null
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Add-WebConfiguration], COMExc
    eption
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Micr
    osoft.IIs.PowerShell.Provider.AddConfigurationCommand

    Reply
    1. Jerry Liu

      Hi Edi,

      It looks like advanced logging was already configured on your IIS server before you ran setup.ps1 and that caused some conflicts.

      A temporary fix could be commenting out line 321
      # & $configAdvancedLogging
      And then run setup.ps1 again.

      Let me know if you could run it successfully.

      Reply
        1. Edi

          Hi, thanks, installation was successful, but when you run the “Generate Command Definition” on the homepage gives the following error:

          Result
          [2015-03-29 23:43:14] Info – copy current definition XML to _def-2015-03-29-11-43-14.xml
          [2015-03-29 23:43:14] Fail – generate command definition XML
          Property Value
          exceptionType System.Management.Automation.MethodInvocationException
          fullyQualifiedErrorId DotNetMethodException
          errMessage Exception calling “Save” with “1” argument(s): “Access to the path
          ‘C:\WebCommander\powershell\_def.xml’ is denied.”
          scriptName C:\WebCommander\powershell\genDefXml.ps1
          scriptLineNumber 200
          offsetInLine 2

          I appreciate the help you can bridle me!!

          Best regards
          Edinson Rodriguez

          Reply
  3. Jerry Liu

    CALL FOR CONTRIBUTORS

    I want to add 2 new feature
    1. streaming output for command of long execution time
    2. interactive PS where human intervention is required during execution

    Anybody experienced in web socket ?
    Please join me the develop this tool.

    Reply
  4. Jerry Liu

    Just added a new command, vmRemoteConsole, to open VM console in browser.
    Please note that VMRC plugin need to be installed and activated in your browser.
    The plugin is installed when you install PowerCLI 5.8+

    Reply
  5. Jago

    Hi, running “setup.ps1″ which it^s now on “install” folder I become the following error.

    PS C:\webcommander> .\setup.ps1
    WebCommander website already exists.
    Updating it with https://github.com/vmware/webcommander/archive/master.zip
    Downloading WebCommander package…
    WebCommander package downloaded successfully
    Extracting WebCommander package…
    WebCommander package extracted successfully.
    start-webitem : The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)
    At C:\webcommander\setup.ps1:308 char:2
    + $website | start-website
    + ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (IIS:\sites\WebCommander:String) [Start-WebItem], FileLoadException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.IIs.PowerShell.Provider.StartItemCommand

    Could somebody tell me why?

    TIA

    Jago

    Reply
  6. Andreas

    Is this fling only to give somebody access to scripts/tasks, or can i also give somebody direct access to the Web Console of a VM?!?

    Reply
  7. Eddy Mansion

    Hi there, just installed the tool and I must say I luv it!!
    Question can I modify the index file and remove the footer details (twitter etc).
    I really want to use this in our production environment.

    Thanks a lot and keep going on with the great work!!

    Reply
    1. MatW

      Yes, it’s possible. I stripped out the footer, the left-hand nav as well as downloaded jquery, the font, etc. to make the tool work in an offline environment.

      It is an awesome tool.

      Reply
      1. Jerry Liu

        I don’t want to include 3rd party codes directly in webcommander. So the online Javascript libaries are referenced by default in webcommander. As you already poineted out, end users may download and use them locally.

        Reply
    2. Jerry Liu

      Thanks for supporting webcommander. Wish it would be helpful in your production environment.
      You could write your own index.xsl to format the page as you wish.
      Let me know if you need help to do that.

      Reply
  8. ram

    I am getting below error when running setup.ps1

    PS C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI> C:\Users\administrator.TESTLAB\Desktop\setup.ps1
    Missing expression after unary operator ‘–‘.
    At C:\Users\administrator.TESTLAB\Desktop\setup.ps1:164 char:10
    + — <<</<!–
    + CategoryInfo : ParserError: (–:String) [], ParseException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

    Reply
    1. Jerry Liu

      Line 164 is “$addWebCommanderSite = {“. There is no “-” at all.
      Could you please confirm if you changed the script before you ran it?

      Reply
  9. Fu Yong

    This tool is great as simple front end as wrapper, and I like it. :)

    I am looking into a feature that can dynamically load menu options by running another powershell script instead of coding static content.

    Ideally, the procedure should be:
    1. User clicks on a workflow named getVMByTag
    2. WebCommander calls a script named getVMByTag_Fill to return available tags
    3. WebCommander display tag name as input, and pre-filled options with available tags
    4. Customer selects a tag

    Step 2 should be generalized so that a single script call is able to retrieve options across all input parameters. This is mainly for performance and manageability.

    Please let me know whether the above can be achieved within the current framework. If not, I hope such feature can be available. Thanks.

    Reply
    1. Jerry Liu

      Sorry for the late response.
      What you mentioned is similar to the addVsanAdapter command. When user clicks the list port group button, all available port groups on the server will be retrieved for the user to select.

      If this is what you want to achieve, please refer to $(‘#btnGetPortGroup’).click(function() in webcmd.js.
      Basically, you need an ajax call to request the information from another command.

      Reply
      1. Fu Yong

        Yes that is what I am looking for. But just to take one step further, is it possible to make this functionality native? So that user provides another script to fill in all UI options, just like the way the primary powershell script is called?

        Thanks.

        Reply
        1. Jerry Liu

          You can define workflow variables so that the output of former commands could be used as input of latter commands. This sounds like the generic way you mentioned earlier.
          For individual command, if you need a helper button for a certain field you need to modify webcmd.xsl to add the button and add ajax call in webcmd.js.

          Reply
      2. Fu Yong

        I have done the followings, but the button doesn’t appear.

        – Edit workflow.js to detect parameter name and add a button
        – Edit webCmd.js to imitate an ajax call (this does not appear to be relevant to the adding button above)

        Reply
  10. MatW

    It would be really nice to expand the documentation a bit to include more detailed instructions on some simple scenarios and basic troubleshooting when trying to add your own custom scripts.

    Reply
    1. Jerry Liu

      I heard you. I will add a few tutorials once I get time to do so.
      For now, please refer to built-in scripts as samples for adding your owns.

      Reply
  11. David

    Hello everyone,
    How ready for a production environment this tool is? I’ve seen that Windows Authentication was just added in version 4. How does integrate with AD?

    Thank you,

    David

    Reply
    1. Jerry Liu

      Actually, the authentication / authorization is all handled by IIS. I simply added a switch in setup.ps1 to enable Windows authentication when webcommander is initially installed. The gun is always ready to shot. The question is whether the shooter himself gets ready. :)

      Reply
  12. Christopher Crossen

    Has anyone managed to get WMI calls to work through webCommander? I’m having a heck of a time with it. Keep getting access denied, no matter what I try.

    An example would be awesome.

    Reply
      1. Christopher Crossen

        Here’s the script code:

        #————————————————-
        ## WMI-Test
        Param (
        $domainName,
        $domainUser,
        $domainPassword,
        $Target
        )
        foreach ($paramKey in $psboundparameters.keys) {
        $oldValue = $psboundparameters.item($paramKey)
        $newValue = [system.web.httputility]::urldecode(“$oldValue”)
        set-variable -name $paramKey -value $newValue
        }
        . .\objects.ps1
        $tst = Get-WmiObject -Namespace “root\cimv2″ -Class Win32_Process -ComputerName $Target
        If ($tst -ne $null) {writeStdout “WMI test successul!”}
        else {writeStdout “WMI test failed!”}
        #—————————————————-

        This is my object reference in the _def.xml file:

        ——————————————————

        WMI-Test2

        Troubleshooting

        ————————————————

        The script is very basic. All it does is test that WMI is working on the remote machine. If it returns a null value then it considers it a failed connection to WMI.

        When I run this in a powershell prompt, it works.
        But it always fails when ran in webCommander.

        Thanks!

        Reply
        1. Christopher Crossen

          Well, I tried to post the xml code that I have in the _def.xml file, but the browser isn’t displaying it on the screen. Something else I noticed, we can’t edit our posts here. :-(

          Reply
        2. Jerry Liu

          Based on the code, it seems you didn’t pass credential to cmdlet Get-WmiObject. That’s why it said access denied.
          Try the commands below:

          $cred = new-object -typeName System.management.automation.pscredential -argumentList “$domainName\$domainUser”, (ConvertTo-SecureString $domainPassword -asPlainText -Force)
          Get-WmiObject -Namespace “root\cimv2″ -Class Win32_Process -ComputerName $Target -credential $cred

          Reply
  13. Jerry Liu

    PHP encodes parameters and passes them to powershell.
    That’s why all powershell scripts in webcommander have the following scriptblock to decode them.
    Not sure if you added it in your script as well.

    foreach ($paramKey in $psboundparameters.keys) {
    $oldValue = $psboundparameters.item($paramKey)
    $newValue = [system.web.httputility]::urldecode(“$oldValue”)
    set-variable -name $paramKey -value $newValue
    }

    Reply
    1. MatW

      It does have the code you mentioned for converting the parameters in the powershell. If I hardcode the info in the Param section, then I fill in the Server parameter only and hit submit, I get Result Execution Time 0.8 seconds … but no output?

      I get a similar behavior if i run the listResourcePool script.

      It appears it’s not passing/converting the serverAddress correctly. Unfortunately I’m not saavy enough to be able to really dig into the code.

      Reply
  14. MatW

    This tool looks like it is exactly what I want to do.

    It took a bit to setup and I think I’m over that hurdle. I’m having issues getting it to work. I’m just trying to do a simple script like list datastores right now. It does not seem to properly pass parameters to the script. If I hard-code parameters, I did get a successful run but I don’t seem to see any output. Running the script from the commandline does provide me with the output I’d expect.

    I’m running out of the box, against a vcenter via FQDN (self-signed cert) with a specific user with a result of:
    Result

    [2014-10-02 14:53:53] Fail – connect to server

    Exception occurred
    Exception Type System.Management.Automation.ParameterBindingValidationException, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
    Fully Qualified Error ID ParameterArgumentValidationError,VMware.VimAutomation.ViCore.Cmdlets.Commands.ConnectVIServer
    Error Message Cannot validate argument on parameter ‘Server’. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
    Script Name C:\webcommander\powershell\objects.ps1
    Scripte Line Number 175

    I can confirm hardcoding with the exact info will work via a powershell window.

    Another note is I’ll eventually need this to work offline. I already have the jquery bits and that seems to work, but still need to figure out the Google font thing.

    Reply
  15. aschi

    Hi,
    i installed webcommander but don’t get it up and running. I try to run the “List VM hosts” Script which is working well localy in powershell (x86). I copied the same values into webcommander but always get an “500 – Internal server error” after ca. 90s, the timeout is set to 120s.
    When I use a wrong hostname I get the result “Fail – connect to server….” which is correct and looks like it’s running, at least a part of it.
    Where could the problem be related? Any Hint would be appreciated.
    Regards,
    aschi

    Reply
    1. aschi

      Additional Information:
      I have an Windows Server 2012.
      The error Log I get from php:
      The description for Event ID 2 from source PHP-5.3.29 cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
      If the event originated on another computer, the display information had to be saved with the event.
      The following information was included with the event:
      php[6824]
      PHP Notice: Undefined index: command in C:\webcommander\www\webCmd.php on line 165
      PHP Notice: Undefined index: serverAddress in C:\webcommander\www\webCmd.php on line 217
      PHP Notice: Undefined index: serverAddress in C:\webcommander\www\webCmd.php on line 219
      PHP Notice: Undefined index: format in C:\webcommander\www\webCmd.php on line 222
      PHP Notice: Undefined index: serverPassword in C:\webcommander\www\webCmd.php on line 222

      Probably a PHP Problem but since I’m not an expert, maybe you know where the Problem could be.
      Regards, Roger

      Reply
      1. aschi

        Additional Info:
        I use php 5.3.29 but also tried 5.9. I setup php manually.
        I set the timeout mentioned in the first Post at the wrong place. After changing it for fastcgi, the script keeps running, no “500 internal server error” until this timeout is reached. During this time I get the errors described before.

        Reply
        1. Jerry Liu

          I didn’t get time to look into the problem you reported earlier. Sorry.
          Well, I don’t think I fully understand your current issue. If the script needs more time to run, you should increase the execution timeout settings in php.ini.
          I never saw the PHP errors you meantioned. But PHP 5.3 should work becaue I used that version as well.
          If you still have problems, please setup a webex session so that I may access your environment to debug.

          Reply
  16. Jay

    1. I’m trying to make use of the Start VM and hardcoding all the parameters, How do I display a message,e.g “Please wait..” before executing the commands.

    2. Is there any way to hardcode the Workflow ? I want to run a copy of scripts in sequences without giving the users the option to change the steps.

    Reply
    1. Jerry Liu

      Hi Jay,

      Sorry for the delayed response.
      Both your requirements could be met by disabling fields in parameter tables.
      For instance, you could use the jQuery command below
      $(‘input[type=text]’).prop(‘disabled’, true);
      Then the user could only view and run the command with provided parameters but couldn’t change them.

      Another option is to provide some static commands (no parameter table is required). You could do this by defining the command in webcmd.xml without the parameters section.
      Please add the bold lines into webcmd.xsl to hide the parameters table when there is no parameter available.

      Parameter
      Value
      Description

      Reply
      1. Jerry Liu

        <xsl:template name=”parameters”>
        <div class=”round-corner”>
        <center>
        <xsl:if test=”parameters/parameter”>
        <form id=”form1″ method=”post” enctype=”multipart/form-data” action=”webcmd.php?command={@cmd}”>
        <table id=”paraTable”>
        <tr>
        <th>Parameter</th>
        <th>Value</th>
        <th>Description</th>
        </tr>
        <xsl:for-each select=”parameters/parameter”>
        <xsl:call-template name=”parameter”/>
        </xsl:for-each>
        <tr>
        <td colspan=”3″ style=”text-align:right”>
        <img id=”imgWait” src=”images/progress-bar.gif” style=”vertical-align:middle; margin-right:20px; visibility:hidden;” />
        <input id=”btnSubmit” type=”button” value=”Submit” />
        </td>
        </tr>
        </table>
        </form>
        </xsl:if>

        Reply
  17. Steve

    Hi, I’m trying to get webcommander up and running. I’m using Win 2008R2.
    powershell scripts run ok manually (eg. listvmhost.ps1).
    website seems ok and is set for ‘administrator’. ran setup.ps1 ok. changed executionpolicy ok.
    When running command (parameters filled in) I just get “webCommander is handling your request. Please wait” then a time out eventually.
    Thanks for any advice

    Reply
    1. Jerry Liu

      First of all, please make sure you could run the script from x86 powershell console without any problem or prompt for user input.

      You may need to configure your browser to set a larger timeout value for http request.
      If you access webcommander via proxy, you need to configure proxy timeout settings as well or bypass it.
      You could also use workflow, which won’t cause browser timeout because the request is via AJAX, to run the command.

      Reply
      1. Steve

        Thanks for the reply. As mentioned the script runs fine from powershell with no user interaction. I’m accessing it initially on the same server so no proxy should be used. We do have a proxy to reach the internet though – is that a requirement? If so, please advise on config.
        Trying with ‘workflow’ option gives similar result without the http timeout (says script “running”).
        Thanks again
        Steve

        Reply
        1. Jerry Liu

          Please note that there are two versions of Powershell on Win2008, x86 and x64. Webcommander uses x86 only.
          If you are sure that the listvmhost script works well with x86 powershell, I don’t understand what blocks it from returning the result in web page.
          Could you please setup a webex session so that I can have a look in your environment?

          Reply
          1. Steve

            Thanks for the response. I have made some progress, although the scirpt was executing fine in Powershell x86 I was receiving the security warning when running even with the executionpolicy unrestrcited. I have bypassed this execution policy with set-executionpolicy bypass, and am making progress now.
            Thanks

            Reply
            1. Jerry Liu

              Nice to hear you figured it out.
              It’s appreciated if you would share more details about the problem.
              Maybe it could benifit other users.

              Reply
              1. Steve

                Although the scirpt was executing fine in Powershell x86 I was receiving the security warning when running even with the ‘set-executionpolicy unrestrcited’.
                I have bypassed this execution policy with ‘set-executionpolicy bypass’ which is probably not best practise but allowed me to make progress.

                Reply
                1. Jerry Liu

                  It seems Windows blocks scripts, downloaded from internet, from running. However, if the zip file is extracted by 7zip, Windows won’t consider the scripts were downloaded and block them.

                  Reply
  18. Aaron Rogers

    Is it just me, or are there missing .ps1 files in WebCommander_v3.0.zip? For example, I would like to use the vmRemoteConsole as found in webCmd.xml but there is no corresponding vmRemoteConsole.ps1 file in the powershell folder. Note that there is a typo in webCmd.xml… it’s listed there as vmRemoteCosole (no “n”).

    Also, when I look at the screenshot on main page (https://labs.vmware.com/wp-content/uploads/2013/11/webCommander3.0.png) there are a lot more icons than on the default WC 3.0 install.

    Thanks!

    Reply
    1. Jerry Liu

      Hi Aaron,

      You are right. This fling contains a subset of total commands available in our internal webcommander server (where the screenshot was taken).
      That’s why you saw more commands in the screenshot.

      I’ll release more and more commands later on. If you need any feature urgently, just email me. I’ll provide assistance as soon as possible.

      Reply
      1. Aaron Rogers

        It is *not* urgent but I would love to see how you are doing the vmRemoteConsole. I started writing my own (based on your existing scripts) but even though it doesn’t give me an error I don’t get a new tab/window with the VM’s remote console. I am not exactly sure how to debug this yet either. The command I am using works fine in PowerCLI.

        Other than that, I can wait. I was super exited when I first saw a demo of WebCommander at VMworld 2013. Will there be any session/coverage at VMworld 2014? It will be super useful for many tasks at my office, including those not specifically related to our vSphere environment. Somehow I did not hear anything about the fling’s release until version 3.0 and just got it running this week so I’m still trying to figure it all out.

        Thanks again!

        Reply
        1. Jerry Liu

          Thanks a lot for your comments. I believe Alan will talk about webcommander in his sessions in VMworld 2014, just as he did last year.
          As for the problems you currently have, please send details to me. I’ll help you to solve them.

          BTW, I wish more customers, who are as insightful as you, would support webcommander. :)
          Truly appreciated!

          Reply
  19. chris

    hi, i am able to run the *.ps1 commands manually to get the information, but when using the web page, when i click the submit button nothing happens. The box at the bottom of the screen still states missing parameters …. any ideas ? i am launching the webcommander page via http://localhost … it just seems ot be an issue with the submit button

    Reply
    1. Jerry Liu

      Does the server have internet access? The jQuery libaray js file referenced by webcommander is online.

      Reply
        1. Jerry Liu

          Sure, you can do that. And you need to modify the xsl files to change the path of the js files.

          Reply
  20. Jerry Liu

    You need to add the following command into Powershell (x86) profile.
    [Reflection.Assembly]::LoadWithPartialName(‘system.web’) | out-null

    Setup.ps1 is supposed to do this automatically when you run it. Did you meet any issue when you ran the script?

    Reply
  21. Adam

    When I try and run any command via the webpage I get 4488 displayed and the page does a wobble but no output.

    When I running a powershell script ie listVMHost with -serverAddress -Username -Password

    I get an error saying unable to find type system.web.httputility

    I have tried on both a 2008 & 2012
    Anyone know how to fix this?

    Reply
  22. Jerry Liu

    Recently I got quite a few customers’ requests about customizing webcommander outputs.
    I feel it’s a better alternative to output such data in JSON format but not XML.

    For instance in listVmHost.ps1, the original output method is:
    foreach ($group in ($portgroup | sort)) {
    write-host “”
    write-host “$($group.name)”
    write-host “$($group.vlanid)”
    write-host “$($group.virtualswitchname)”
    write-host “”
    }

    And the new way is:
    $json = ($portgroup | sort) | convertto-json -depth 1
    writeStdout $json

    Although the new JSON output may not be as pretty as before showing in web browsers, there is no need to modify webcmd.xsl to transform new XML elements. So I believe this is a worthy trade-off.

    Reply
  23. Adam Durbin

    Hi All,

    I have setup Commander on a Windows Server 2008 R2 server – everything appears to be working correctly for all the inbuilt powershell scripts however when I try to create a new script to do something simply like list all VMs and there HW version and Tools status I get no results table information – I have tried using the inbuilt powershell scripts as a foundry however the script runs but no results table is presented (I am converting the output to xml the same as the inbuilt scripts).

    Can anyone point me in the right direction what files need to be modified for a new script (I have found the xsl file which contains what I am assuming is the required table formatting however after entering in what I believe is the required information I still get no table of results).

    Reply
    1. Jerry Liu

      Hi Adam,
      Your direction is correct. You need to make ps1 file to output XML and then add a template in webcmd.xsl to transform it into html.
      Based on your description, I believe your new code needs to be refined.
      Please send them to me if you couldn’t figure out the problem

      Reply
      1. Adam Durbin

        Powershell Code:

        ## Author: Adam Durbin

        Param (
        $serverAddress,
        $serverUser=”root”,
        $serverPassword=$env:defaultPassword
        )

        foreach ($paramKey in $psboundparameters.keys) {
        $oldValue = $psboundparameters.item($paramKey)
        $newValue = [system.web.httputility]::urldecode(“$oldValue”)
        set-variable -name $paramKey -value $newValue
        }

        . .\objects-det.ps1

        #Connect to VC Server
        try {
        $viserver = connect-VIServer $serverAddress -user $serverUser -password $serverPassword -AllLinked -EA stop
        } catch {
        writeCustomizedMsg “Fail – connect to server $serverAddress”
        writeStderr
        [Environment]::exit(“0″)
        }

        #writeCustomizedMsg “Connected to server $($viserver.name)”

        Function Get-VIScheduledTasks {
        PARAM ( [switch]$Full )
        if ($Full) {
        # Note: When returning the full View of each Scheduled Task, all date times are in UTC
        (Get-View ScheduledTaskManager).ScheduledTask | %{ (Get-View $_).Info }
        } else {
        # By default, lets only return common headers and convert all date/times to local values
        (Get-View ScheduledTaskManager).ScheduledTask | %{ (Get-View $_ -Property Info).Info } |
        Select-Object Name, Description, Enabled, Notification, LastModifiedUser, State, Entity,
        @{N=”EntityName”;E={ (Get-View $_.Entity -Property Name).Name }},
        @{N=”LastModifiedTime”;E={$_.LastModifiedTime.ToLocalTime()}},
        @{N=”NextRunTime”;E={$_.NextRunTime.ToLocalTime()}},
        @{N=”PrevRunTime”;E={$_.LastModifiedTime.ToLocalTime()}},
        @{N=”ActionName”;E={$_.Action.Name}}
        }
        }

        Function Get-VMScheduledSnapshots {
        Get-VIScheduledTasks | ?{$_.ActionName -eq ‘CreateSnapshot_Task’} |
        Select-Object @{N=”VMName”;E={$_.EntityName}}, Name, NextRunTime, Notification
        }

        try {
        $Snapshots = Get-VMScheduledSnapshots | where {$_.NextRunTime -ne $null}

        #writeCustomizedMsg “Found $($Snapshots.count) Snapshots on $($viserver.name)”

        foreach ($Snapshot in $Snapshots) {
        write-host “”
        write-host “$($Snapshot.vmname)”
        write-host “$($Snapshot.name)”
        write-host “$($Snapshot.nextruntime)”
        write-host “$($Snapshot.Notification)”
        write-host “”
        }

        }

        Catch {
        writeCustomizedMsg “FAILED to get list of snapshots”
        writeStderr
        [Environment]::exit(“0″)
        }

        Finally {
        disconnect-viserver * -confirm:$false
        }

        XSL File:

        VMNameNameNextRunTimeNotification

        Reply
  24. Daniel Peluso

    Hi Guys,
    Love your work, I have been testing out the fling to cater for some typical scripting use cases.
    As a bit of a feature enhancement I have created an ability to review the output logs post execution. The codes a little crude an needs some cleaning up but touch base with me and I can send on the enhancement.
    Cheers, Daniel.

    Reply
  25. Marc Petrivelli

    Went through the installation on windows server 2012. The guide assumes you have access to installation media to get the .NET framework installed. If you are running in a VM environment this where you created the VM with template this might be an issue.

    Reply
  26. Susan

    I have a problem when installing, the message is as follows:

    import-module : The specified module ‘webadministration’ was not loaded because no valid module file wa
    module directory.
    At C:UsersAdministratorDesktopWebCommander_v2.0setup.ps1:38 char:1
    + import-module webadministration
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ResourceUnavailable: (webadministration:String) [Import-Module], FileNotF
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

    Reply
    1. Jerry Liu

      It sounds your server doesn’t meet system requirements.
      please confirm if you get iis 8 on 2008 or 2012. If not, please follow the guide to prepare the server.

      Reply
  27. Jerry Liu

    To upgrade from 1.1 to 2.0, just copy the following files and folders to your webcommander folder.
    www\workflow.html
    www\workflow.css
    www\workflow.js
    www\index.xsl
    www\webcmd.xml
    www\images
    powershell\updateWindowsSync1.ps1
    powershell\updateWindowsSync2.ps1

    On the index page, you are supposed to see a workflow link to the left webCommander logo. Click it, and you will get to workflow.html to compose the workflow.

    Reply
  28. jeff s

    I’m pretty excited to get this up and running. Can you please help me get past the “WARNING: This script must run in AMD64 Powershell” loop I’m seeing?

    Windows PowerShell
    Copyright (C) 2012 Microsoft Corporation. All rights reserved.

    PS C:\Users\Administrator> Set-ExecutionPolicy Unrestricted -force
    PS C:\Users\Administrator> cd C:\WebCommander
    PS C:\WebCommander> .\setup.ps1

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): r
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): R
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): R
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”):

    Reply
      1. jeff s

        It’s set to Unrestricted in both Powershell and Powershell (x86);

        PS C:\Users\Administrator> Get-ExecutionPolicy
        Unrestricted

        Reply
          1. jeff s

            Ok. I’m past that and it seems to be working, but when I select a task and enter the correct IP address, username, and password, and then hit submit, I see “webCommander is handling your request. Please wait.” but nothing else ever happens—it will sit there and no data will ever come back, nor is an error thrown.

            thanks for your help!

            Reply
            1. Jerry Liu

              May I know which command you ran and also the parameters you used?
              You may try simple one, like listvmhost, first to check if the connection to VI server is successful.

              Reply
                1. jeff s

                  Ya, this is a Powershell / PowerCLI issue.

                  Should I be able to open Powershell and enter the “Connect-VIServer” command?

                  Reply
                  1. Jerry Liu

                    You don’t need to run the command first. Here is my suggestion:
                    1. launch x86 ps console
                    2. cd c:\webcommander\powershell
                    3. run “.\listVmHost.ps1 -serverAddress -serverUser -serverPassword ”

                    Let me know if it returns the result correctly or gets blocked somewhere.

                    Reply
  29. Jerry Liu

    WebCommander 2.0 is released. The newly added feature – workflow allows users to run multiple commands together in either serial or parallel.
    The command to install Windows updates in remote machine is also added.

    Reply
  30. Jerry Liu

    If you use Powershell v2 but not v3, please change the following line in objects.ps1
    from if ($psVer[0] –in (“2″, “3”, “4”))
    to if ((“2″, “3”, “4”) -contains $psVer[0])

    Reply
  31. Jerry Liu

    When webcommander returns the page containing the error, please right click on it and select view source code. I need to see the entire content for investigation. Please don’t just copy part of it.

    If you don’t want to post the content here, you may send it via email. My email is liuj@vmware.com.

    Reply
  32. Dany Grenier

    Hi,
    I have this error when I try to execute «listVmHost»

    The term ‘newServer’ is not recognized as the name of a cmdlet, function, scrip
    t file, or operable program. Check the spelling of the name, or if a path was i
    ncluded, verify that the path is correct and try again.
    At C:\WebCommander\powershell\listVmHost.ps1:43 char:20
    + $server = newServer <<<< $serverAddress $serverUser $serverPassword
    + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
    tFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    Any idea why ?

    Thanks

    Reply
      1. Dany Grenier

        Hi,
        I also have this error and the site is running as administrator.

        You must provide a value expression on the right-hand side of the ‘-‘ operator.
        At C:\WebCommander\powershell\objects.ps1:198 char:18
        + if ($psVer[0] – <<<< in ("2", "3", "4")) {
        + CategoryInfo : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : ExpectedValueExpression

        Reply
        1. Jerry Liu

          Sorry, I meant to reply to your question, but my post shows in a wrong position. Please see my response at the top, November 8, 2013 at 8:07 am.

          Reply
  33. Heath

    When I attempt to run setup.ps1 I get stuck in a loop :

    “This script must run in AMD64 Powershell”
    “Lauching AMD64 Powershell”

    This repeats down the screen in a loop.

    I am doing a right click “run as administrator” on PowerShell (x86), set-executionpolicy unrestricted -force, then running setup.ps1. At that point I get stuck in a loop.

    I have tried the install on Server 2008 and Win7, I don’t have a 2012 template in this lab.

    Reply
      1. Heath

        Thanks, I am a little further along now. I set-executionpolicy unrestricted -force for powershell 64bit and ran the install script. I then set connect as “administrator” in basic settings. I can now select a script and enter the parameters, but it returns a blank screen.

        My server isn’t connected to the internet so I edited the xsl file with a path to local query. I simply downloaded the jquery library and extracted it to the www directory.

        webCommander

        Here is a link to my www log, the last thing I see is the post of the form data. It does take a few seconds before it returns the white screen, like it is doing something.

        http://pastebin.com/raw.php?i=6n75eTtZ

        Is there logging of the powershell / powercli commands so I can see if they are returning data?

        Reply
        1. Jerry Liu

          Could you please right click on the “white screen” and then click “show page source”?
          Let me know what displays there.

          Reply
            1. Jerry Liu

              Looks really weird. Did you edit objects.ps1 before getting this error?
              If convenient for you, please send your objects.ps1 back to me for further investigation.

              Reply
  34. Enrique

    I cam make installation with no issues. I followed all steps and when I access the web page and select an icon I enter into the form. Then I fill all the fields in the form, then click on submit and nothing happens. I always have the message Missing parameters and nothing more. Any Reason? Thanks

    Reply
    1. Jerry Liu

      Please check if your server has access to internet. If not, you need to download Jquery library scripts and edit webcmd.xsl accordingly.

      Reply
      1. Enrique

        Now when I run any script, fill all the fields in form and click submit I can see “Running” in the screen but command is not running in VC. Then I receive a XML error and nothing more happens. I’ve commented line $xmloutput .= “” . $output . “”; in webcmd.php and command returns 4488 code but nothing happens in VC. What can I do?

        Reply
        1. Jerry Liu

          If no error is found in $output, web commander reports success (4488).
          You should never comment out the output.
          Please restore the original files. On the xml error page, right click and select view source code. Let me know what shows there.

          Reply
          1. Enrique

            This is the source code:

            root
            administrator

            Debe proporcionar una expresi�n de valor a la derecha del operador ‘-‘.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\objects.ps1: 198 C
            ar�cter: 18
            + if ($psVer[0] – <<<< in ("2", "3", "4")) {
            + CategoryInfo : ParserError: (:) [], ParseException
            + FullyQualifiedErrorId : ExpectedValueExpression

            El t�rmino 'newServer' no se reconoce como nombre de un cmdlet, funci�n, archiv
            o de script o programa ejecutable. Compruebe si escribi� correctamente el nombr
            e o, si incluy� una ruta de acceso, compruebe que dicha ruta es correcta e int�
            ntelo de nuevo.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\listDatastore.ps1:
            39 Car�cter: 20
            + $server = newServer <<<< $serverAddress $serverUser $serverPassword
            + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
            tFoundException
            + FullyQualifiedErrorId : CommandNotFoundException

            Get-Datastore : 06/11/2013 16:50:27 Get-Datastore You are not current
            ly connected to any servers. Please connect first using a Connect cmdlet.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\listDatastore.ps1:
            40 Car�cter: 27
            + $datastore = get-datastore <<<< -Server $server.viserver
            + CategoryInfo : ResourceUnavailable: (:) [Get-Datastore], ViServ
            erConnectionException
            + FullyQualifiedErrorId : Core_BaseCmdlet_NotConnectedError,VMware.VimAuto
            mation.ViCore.Cmdlets.Commands.GetDatastore

            448873.7 seconds<![CDATA[http://w2k8permeabilid.desa.redes.aeat:80/webcmd.php?command=lis

            Thanks in advance

            Reply
              1. Jerry Liu

                I don’t understand “Debe proporcionar una expresi�n de valor a la derecha del operador ‘-’.”
                I guess it means that the dot source to objects.ps1 doesn’t work on your server whose OS language is not English.
                webCommander has never been deployed or tested on localised OSes.

                Besides, I have no rights to delete comments here.

                Reply
                1. Enrique

                  + $server = newServer <<<< $serverAddress $serverUser $serverPassword
                  + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
                  tFoundException
                  + FullyQualifiedErrorId : CommandNotFoundException

                  En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\objects.ps1: 198 C
                  ar�cter: 18
                  + if ($psVer[0] – <<<< in ("2", "3", "4")) {
                  + CategoryInfo : ParserError: (:) [], ParseException
                  + FullyQualifiedErrorId : ExpectedValueExpression

                  I think this is the problem

                  Reply
                  1. Jerry Liu

                    Another user’s comment just remind me.
                    Did you follow the guide to set the web site to run as administrator?

                    Reply
  35. Jerry Liu

    If the encrypted password also works (I mean to execute the script successfully), why shall we encrypt it?
    If the encrypted password won’t work, why shall we put it in the URL?

    Reply
    1. bvi1998

      Hi,
      Thanks for this fling :) … I see that you have planned to create scripts to run the Windows updates on a server. Do you have that script, and would you please share it?
      Also, how can we remove that URL showing the password?
      Thanks,
      Jen

      Reply
      1. Jerry Liu

        Sorry, I didn’t see this question in time. Windows update scripts will be included in version 2.0. A cool feature called workflow will also be added. Please get ready to be amazed. :)

        Reply
  36. Yolkfull

    This is really useful tool and being infrastructural instrumentation for automation test development. Especially those all kinds of web services that Web Commander provided, they enable us the capabilities to interact with View Connection Server, View Agent, MS AD machine etc from view Mobile Clients machine.

    Reply
  37. Sean Duffy

    Looks great guys. I would suggest adding encryption on the password parameter that is visible in the URL generated for any given script that uses credentials. :)

    Reply
    1. Jerry Liu

      I wanted to reply to suggestion, but don’t know why it showed up at the top.
      Please refer to my comment written at October 20, 2013 at 8:11 pm

      Reply
  38. Zhi

    This is instrumental in automation; There are various automation frameworks in different languages, e.g. python, java, jython, powershell …, and some core functions are duplicated across these frameworks; With webCommander, we can share these public utils and it will save us a lot of effort; we can call webCommander service with lots of languages even with shell.

    Reply
  39. bvi1998

    Hi,
    When I launch the website and click on, let’s say, install powershell, I receive the Result: Missing parameters before I even get to do anything. Then, I try to launch the script and it does nothing…. I have followed the instructions, I am not sure what I am missing. Help please? Thanks!

    Reply
    1. bvi1998

      Actually, when I try to run the setup again in x86 Powershell, I get the message that the script must run in AMD64 powershell. Therefore, as the instructions state to run the setup in x86 Powershell, obviously I can’t ….
      So, the fact that I did not run the setup in x86 Powershell, is that why this is not working for me (in above post).
      Thanks!

      Reply
      1. Jerry Liu

        Because PHP for IIS is 32bit, it can only launch x86 powershell which in turn to execute all PS1 scripts of webCommander.
        So the execution policy of x86 powershell must be set to unrestricted.

        The setup.ps1 contains some cmdlets running better in x64 than x86, so I forced it to be executed in x64. And this is automated.

        Reply
    2. Jerry Liu

      This is expected.
      You need to input parameters in the form and click submit.
      Otherwise, the result is “missing parameters”.

      Reply
  40. Jason

    Ok, I was able to get a new script added to webcommander and able to execute it , however the results are not displaying back to the site after execution. I have added the appropriate parameters to help with the special characters as per the documentation. Any help on why the results are not displaying?

    Reply
    1. Jerry Liu

      You could find any output (result) of your ps1 script in the source code of the web page.

      However, web commander only displays (in browser) the output generated by function writeCustomizedMsg, writeStdout and writeStderr. All these 3 functions are defined in objects.ps1.

      If you want other output showing in browser, you need to modify webcmd.xsl to add a new format template. Please refer to line 258 to 402.

      Reply
      1. Jason

        I’ll be the first to admit I have never used xslt before and have very little experience with php. I have tried to modify webCmd.xsl to get my results to show, still no luck. I am going to provide my very basic script and the change I added to the webCmd.xsl. Can you please help me with what I am doing wrong?

        VM Count Script

        Param (
        $serverAddress=””,
        $serverUser=”root”,
        $serverPassword=$env:defaultPassword
        )

        foreach ($paramKey in $psboundparameters.keys) {
        $oldValue = $psboundparameters.item($paramKey)
        $newValue = [system.web.httputility]::urldecode(“$oldValue”)
        set-variable -name $paramKey -value $newValue
        }

        . .\objects.ps1

        $server = newServer $serverAddress $serverUser $serverPassword
        $vms = Get-VM -Server $server.viserver
        $count = $vms.count
        write-output “”
        write-output “$count”
        write-output “”

        webCmd.xsl addition

        VM Count

        Any suggestions?

        Reply
            1. Jason

              I figured out my issues. Apparently xsl is case sensitive. Once I corrected that I was able to run my script and have the results display back.

              Reply
  41. Steven T

    I am able to get everything installed fine and I can execute the setup.ps1 file. I am not getting any data returned from the scripts when I run them. After a couple of quick mods, I am able to execute the scripts directly. Any ideas? I am on Windows 2012 Server.

    Reply
      1. Jerry Liu

        Thanks Steven for your sharing!

        Because PHP for IIS is 32bit, it calls x86 Powershell to run the ps1 scripts. That’s why the execution policy of x86 Powershell must be set.

        Reply
        1. Steven T

          Yeah, i read the directions 10 times and for some reason, my brain can’t process “(x86)”. Apparently, if you bang your head on your desk enough, your vision gets blurry and it becomes visible.

          Reply
  42. Jerry Liu

    Hi web commander users,

    In case you meet an error as described at the bottom when you run web commander, here are the fix steps:
    1. open IIS console
    2. select webcommander web site
    3. click basic settings in the right panel
    4. click connect as button
    5. select “specific user” and input administrator

    =================================================================
    Add-PSSnapin : Unable to generate a temporary class (result=1).
    error CS2001: Source file ‘C:\Windows\TEMP\bh4relje.0.cs’ could not be found
    error CS2008: No inputs specified
    At C:\Windows\SysWOW64\WindowsPowerShell\v1.0\profile.ps1:1 char:13
    + add-pssnapin <<<< VMware* -ea SilentlyContinue
    =================================================================

    Reply
  43. Jason

    Having issues running setup.ps1. Continues to error out on “Failed to create and start web site. Please make sure IIS Mgmt Service is started.” I have verified the service is up and running and when I check IIS I see that it creates the webcommander site, however it is listed as unknown with a red X. Any suggestions?

    Reply
      1. Jason

        I was able to get the site created manually, however now I am receiving this error when I try and run a script from WebCommander.

        HTTP Error 500.0 – Internal Server Error
        C:\Program Files (x86)\PHP\v5.3\php-cgi.exe – The FastCGI process exceeded configured request timeout

        Any suggestions?

        Reply
        1. Jerry Liu

          Considering you manully created the site, please make sure the account with which the site is running has the previllege to execute powershell scripts.
          The easiest way is to make it run as local administrator.
          BTW, did you run setup.ps1 as administrator or another user?

          Reply
          1. Jason

            The account I used to create the website has local admin rights. I also ran the setup.ps1 from the ‘Run As Admin” PS Console.

            Reply
            1. Jerry Liu

              In this case, I cannot see any other reason why setup.ps1 failed than IIS version mismatch.
              As for error 500, please try to run the script from x86 powershell console. I suspect there is some configuration on your server blocking the execution.

              Reply
  44. Jerry Liu

    I have no idea what it means by waiting for moderation.
    Has the authentication / identity issue been solved by changing the application pool identity?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>