Key Development Skills for IT Pros

EMC logo

This post was originally published February 19, 2019 on AbleBlue.

In my former life as a consultant, I was constantly aware of the impact that the pace of cloud technology evolution has on IT professionals. Recently, while moderating a panel at Office and SharePoint Live! 360 in Orlando, I asked the question: “IT Pro vs. Developers, is it time to bury the hatchet?” The panel consisted of four great friends of mine, Eric Shupps and Ben Curry, representing the IT Pro side of the house; and Rob Windsor and Paul Schaeflein, representing the Developers.

As I watched, listened, cajoled and questioned, the general consensus from the developers was that IT still struggles with understanding “modern development and development tools.” While IT insists on Developers following a standard of practice, the IT pros themselves still use haphazard and sometimes risky procedures for themselves, and do not hold their IT teams to the higher standards development uses.

The general consensus from the attendees was they supported that contention. We heard story after story from the IT pros in the audience about how they are not supported with the right tools to become better, that the IT organizations are not investing in them and their future, that they are too busy fighting fires to take the time to learn something new.

While I do understand the reality that we are all busy, as a trainer in my previous life I recognize that organizations have to train their people and allow them the time to “Level Up” their skills. I think it is necessary for the employees’ well being, their organizations’ longevity, and ultimately the supportability of the systems they manage.

Microsoft makes it easier than ever for IT pros to get up and running with the necessary tooling to dip their toes in development waters, while making their job easier and providing a better process for the companies they support. IT pros may start by initially switching from PowerShell ISE to VSCode with the PowerShell Extension. If you are “just writing scripts,” step up and try writing PowerShell Modules instead.

Here are four ideas to get you started.


I am always thinking about how repetitive a task is. If I have to do it more than 2 times I’ll try to figure out how to be more efficient. For example, if you have ever written the same script over and over, start thinking about creating PowerShell Modules for the functions that you use repeatedly. These could be anything from routine maintenance tasks, to heroic data restoration tasks. By thinking about the tasks that would have to be executed in an emergency before the emergency happens, your stress level will be much lower when the day comes that you need the module.

Another idea to save time is using snippets when writing your code. There is a fantastic community project for Visual Studio Code (VSCode) called Awesome Snippets that will get you started. I have some customers that have created their own snippets that they share as a team.

Further Reading

VSCode PowerShell Extension – Write, Debug, and Test PowerShell in VSCode.
Awesome Snippets – PowerShell Code Snippets


On a recent project, I was concerned about the number of folks that were going to be messing with the module I was writing. I noticed a few individuals were not providing documentation, examples, or full sentences in the help text. Now this may not seem important, but if they are failing to properly document the code, how much attention are they paying to the code itself?

Back in November I had the pleasure to hear Thomas Vochten, MVP speak at SharePoint and Azure Connect in Haarlem, Netherlands. He demonstrated an approach to testing PowerShell using a module called Pester. This module ships with Windows 10 and there are updates available from the community. There are two reasons I really like this approach.

  1. The process of creating tests helps you ensure your code works as you intended.
  2. The process of creating tests and monitoring code coverage can help ensure that you test the alternate paths of your code.

There is a “tax” associated with creating tests, however — it takes time that does not directly impact the delivery of your PowerShell code. I admit, I am not “writing the test first and then writing the code,” in true TDD fashion. In fact, the first module I used Pester to test was a module I thought was nearly complete. That is where the PesterHelpers module can bootstrap a bunch of tests for you by reading your existing module and generating tests for you.

Further Reading

Pester – Test and Mock Framework for PowerShell
Pester Helpers – Helper functions for Pester
MVA: Testing PowerShell with Pester – Microsoft Virtual Academy Course on Pester

Version Control

I use version control for nearly everything I write. My documents are in OneDrive, not a version control system per se, but it is backed up to the cloud on every save. My blog posts are written in markdown, and version controlled in Azure DevOps (aka All of my PowerShell modules and scripts are in separate projects by Customer and/or Project and stored in Azure DevOps. It doesn’t matter if it’s Azure DevOps or or any other system you are familiar with, most of these systems use a flavor of Git for version control. I think that every technical person should have a grasp of the basics of Git. You need to be able to Fork, Checkout, Branch, Add, Commit, and Merge with confidence.

I am pretty comfortable with this process because I use it every day. Do I NEED to? No, could I use OneDrive for my module files, sure. But by forcing myself to implement these practices, I can talk to a developer about Git and the issues they face with a shared understanding. I can transition from working on my Surface on the couch with my dog Ruby, to my home office, to the Mac at my downtown Austin office, with ease and confidence. It makes me comfortable knowing I have all the versions of my edits stored safely somewhere other than one hard drive. Further, as soon as you add a team, it becomes significantly easier to share your stuff.

Further Reading

Azure DevOps – Project Management, Version Control, Build Management, and Continuous Integration


I like to think of DevOps as thinking end to end, or holistically, in terms of the lifecycle of the work. From defining the problem to writing the first line of code to delivery to applying updates, “lifecycle” DevOps thinking will help your work be portable. For example, that cool module that you built that may, someday, need to be updated — are you the only person who has the code? Can your team update it confidently or update it without you? Can they change the code without erasing your farm, locking you out of the tenant, or causing other issues? Do they have to call you on your vacation…just in case?

DevOps is about supporting the enterprise and managing the lifecycle of your code whether you are a Developer an IT pro or a combination of the two. By creating testable code, you can configure your version control system to reject check-ins that do not pass the tests. You can configure the build server to automatically deploy your runbooks when they do pass the tests, so that they enter production as efficiently as possible.

In other words, I like to enjoy my vacations, and I assume you do, too

What items are on your shortlist for “The Next Thing” you want to learn to level up for your role?

The Interview

Update your feed preferences





submit to reddit


  • No Related Posts

7021399: Managing Updates to Shared VBA Macro Code for Multiple Users

Note: The steps in this technical note apply to both IBM and VT terminals, however the example code refers to an IBM terminal. The event names are slightly different for VT terminals.

Reflection VBA macro code is stored in Reflection settings files (.rd3x, .rd5x, .rdox), along with other necessary configuration details for each host session. If you provide a group of users with a settings file that includes custom macro code, then it later becomes necessary to update this macro code, you could simply provide updated settings files to everyone, however, any personal settings that have been saved by individual users would be lost.

To avoid the problem of losing personal settings, and to simplify administration of Reflection VBA macro code among groups of users, Microsoft Visual Basic for Applications Extensibility can be used to enable everyone to receive updates automatically on a regular basis; for example, each time a session is opened. Code can be added to the IbmTerminal.BeforeConnect event in VBA that will update the local VBA project with new code from a central location each time a settings file is opened.

How It Works

  1. Create and test the VBA macro code that will be distributed to end users. Place all code that needs to be centrally managed in a single VBA module. Name the module something other than Module1. The example in this technical note uses SharedMacroCode.
  1. When custom code for this module is complete, export it to a separate text file by clicking File > Export in the VBA Editor. Accept the default file name SharedMacroCode.bas.
  1. Copy SharedMacroCode.bas to a central location accessible to all users who will need it, for example, Z:remotelocationSharedMacroCode.bas.
  2. Create a new settings file (.rd3x, .rd5x, .rdox) for distribution to end users that will include the VBA Extensibility code necessary to dynamically import this remotely located macro code. Open the Visual Basic Editor, click Tools > References, and select the Microsoft Visual Basic for Applications Extensibility check box:
  1. In the Project pane of the Visual Basic Editor, under Reflection Objects, double-click ThisIbmTerminal (or ThisTerminal for VT sessions) to open the associated module for the Terminal object.
  2. Select the IbmTerminal object from the drop-down object list above the Editor pane, then select its BeforeConnect event from the drop-down event list. Visual Basic will automatically add the stub of an event-handler subroutine, as shown:
  1. Add code to the event-handler subroutine created in step 6 to import code from SharedMacroCode.bas into the local VBA project. Follow this example:

Private Sub IbmTerminal_BeforeConnect(ByVal sender As Variant)

'handle errors in-line...

On Error Resume Next

'include reference to "Microsoft Visual Basic for Applications Extensibility"

Dim vbproj As VBProject

Dim vbc As VBComponent

Set vbproj = ThisIbmTerminal.VBProject

'Error will occur if component with this name is not in the project

Set vbc = vbproj.VBComponents.Item("SharedMacroCode")

If Err.Number <> 0 Then


'so add it...

vbproj.VBComponents.Import "Z:remotelocationSharedMacroCode.bas"

If Err.Number <> 0 Then

MsgBox "Could not import new VBA code: Z:remotelocationSharedMacroCode.bas", , _

"IbmTerminal_BeforeConnect event"

End If


'no error - vbc should be valid object

'remove existing version first before adding new version

vbproj.VBComponents.Remove vbc

vbproj.VBComponents.Import "Z:remotelocationSharedMacroCode.bas"

If Err.Number <> 0 Then

MsgBox "Could not update VBA code from Z:remotelocationSharedMacroCode.bas", , _


End If

End If

End Sub


  1. The settings file containing this code can now be distributed to end users, and each time it is opened, this BeforeConnect event will automatically update the local VBA project’s SharedMacroCode module with a new version retrieved from Z:remotelocationSharedMacroCode.bas.

Note the following:

  • All users who need to access dynamically updated VBA code in this manner will need to have the same drive mapped to the same folder, as in the example, Z:remotelocation....
  • Exported modules from VBA (.bas files) are plain text. You can make edits to the file without re-importing it into Visual Basic.
  • Event names are slightly different for VT terminals than the IBM terminal example in this technical note. For VT sessions, the “Terminal_Connected” event is recommended.
  • The example shows how to dynamically import a single standard module into a VBA project, however, it is also possible to import user forms and VBA classes as well. For more information about working with the VBA Extensibility library, search the Microsoft Visual Basic Reference Help index for "VBProject object."


How to Debug iOS App Wrapped with XenMobile MDX Toolkit

In XenMobile, when we wrap the iOS app with MDX toolkit, deploy it to the device, and then try to debug the app in Xcode, we find that the debugger will not stop at the breakpoint line. The default build settings in Xcode does not allow the code to stop when breakpoints are hit. This article lists the changes to the Build settings that will allow you to debug the iOS app that is wrapped with MDX toolkit.


7021313: Verastream Host Integrator 7.6 Features, Fixes, and Release Notes

What’s New in Version 7.6?

This release includes the previous 7.5 SP1 updates (described in Technical Note 10147), plus the following new updates:

Key Features

Security Updates

  • Session server security vulnerability has been addressed. For additional information, see Technical Note 2700.
  • Java 7 Update 45 is installed which addresses multiple Java security issues. For more information, see Technical Note 2700.
  • Cryptographic library version 3.2 has been introduced for all platforms, which meets FIPS 140-2 standards on Windows, Solaris, and Linux. For more information, see Technical Note 2400.
  • In the management server, stronger password hash algorithms have been implemented.
  • In Web Builder project properties, “Require encrypted connection to VHI server” (previously “Require secure connection”) is enabled by default. This option affects the communication between the client connector (called by web application or data object) and session server. Note: Encryption processing can adversely impact performance, especially in heavy load scenarios.
  • On UNIX/Linux platforms, the installer sets more appropriate directory and file permissions.

Session Server Updates

  • Resolved truncated pointer issues on 64-bit Windows platforms. In versions 7.5.70 through 7.5.1030, crashes can occur on 64-bit Windows due to access violations (for example, Windows Event Viewer may report “Host Integrator component Verastream Host Integrator Session Server restarting. Reason: Exit code = -1073741819”).
  • Resolved an issue with pooled sessions when session server is running on a multi-processor core system. In earlier 7.x versions, after a session disconnection, subsequent clients may fail to connect.
  • Message ID 3070 “No current entity” has changed from an error to a warning. This message will no longer be repetitively logged when using the built-in Terminal3270 to Terminal5250 web applications (with the session server default logging configuration, errors only).

Web Builder and Web Application Updates

Design Tool Updates

  • After using Design Tool to deploy a model as a session pool, the minimum idle host sessions and initial idle host sessions are configured in the session server (in addition to the minimum total sessions). These settings were introduced in Administrative Console in version 7.0 and are supported in deployment descriptors in version 7.1 and higher, but are not directly configurable in Design Tool Deployment Options.
  • In Design Tool, after deploying a model as a session pool, the Test button will start Web Services Explorer with a session pool WSDL URL. In previous versions 7.1 through 7.5 SP1, the Test button always used the non-pooled WSDL.
  • In Design Tool, after deploying a model that contains no table procedures, the Test button is no longer displayed. In versions 7.1 through 7.5 SP1, clicking the Test button would cause Web Services Explorer to call a non-existent WSDL (and display an error “WSDL Exception: faultCode=OTHER_ERROR: Server returned HTTP response code: 500”) since SOAP web services are not generated for models without procedures.
  • Design Tool successfully displays host screens when a connection is negotiated as “Basic TN3270E.”
  • You can open multiple Design Tool instances with models that have Java event handlers. In version 7.5, after attempting to open a second model that uses Java event handlers, the Design Tool application would close.
  • In Design Tool, if you create a new model entity by right clicking in Model Debug Messages, the snapshot is properly saved. In previous versions, when you re-open the model and work offline, you would see an error “[3712] Snapshot not found for entity ‘entity name’.”

Administrative Console Fixes

  • In Administrative Console, the Sessions view no longer displays Last Used dates of 31-Dec-1969 or 01-Jan-1970 under certain circumstances (such as terminating sessions after creating a new pool with idle sessions).
  • In Administrative Console, resolved a java.lang.ClassCastException that could occur when changing logging configuration during execution of a log query.
  • In Administrative Console, if you are monitoring multiple active sessions, the correct host screens are displayed. In previous 7.x versions, after host session activity, all session monitor views would display the same host session.
  • Resolved a null pointer exception that could occur when disconnecting Administrative Console when a Session Monitor view is active.

Installer Updates

  • When installing VHI on UNIX/Linux systems, if the temporary directory (typically /tmp) does not have sufficient space available to unpack files, an appropriate error message is displayed. Also, a new --tmpdir command line argument is now supported to specify a different temporary directory. Typically at least 330 MB of temporary space is required.

Obtaining Your Product Update

Customers with a current maintenance plan are eligible to download Verastream Host Integrator 7.6 from the Attachmate Download Library at

For more information on using the Download Library, see Technical Note 0200.

Note: The product download is a full product package that can be used for new installations or to upgrade existing installations.

Installing Your Product Update

For more information about installing the update on an existing installation, refer to the appropriate Technical Note:

Known Issues with Upgrades

  • On AIX, installing version 7.6 over a previous version may result in session server core dumps (caused by management cluster certificates originally generated by version 7.1.x).
  • After upgrading your server, users accessing web applications should clear web browser caches to avoid unexpected issues. (This recommendation especially applies to users running Microsoft Internet Explorer or Mozilla Firefox to access the built-in Terminal3270 or Terminal5250 web applications, or an HTML5 Web Application generated by Web Builder that displays terminal screens.)


7021584: Web Builder .NET Project Errors on Windows 7 or Windows Server 2008

When running Verastream Host Integrator (VHI) Web Builder on newer Windows platforms, .NET projects may fail to build or run.

Note: Beginning in VHI version 7.5, the HTML 5 Web Application project type, which is platform and technology independent, is available in Web Builder. The .NET and Java Web Application project types are still available but deprecated on the Legacy tab.

When running VHI Web Builder on Windows 7, Windows Server 2008, or Windows Vista, you may see an error when building or running a .NET project.

After successfully building a .NET web application project, you may see the following IIS runtime error when the web application is launched:

HTTP Error 403.14 - Forbidden

The Web server is configured to not list the contents of this directory.

View Full Size

Figure 1. Internet Information Services 7.5 Server Error
Figure 1. Internet Information Services 7.5 Server Error

When building a .NET web service project (created in version 6.6 or earlier), you may see a build error similar to the following:


Reason: The following error occurred while executing this line:

C:Program FilesVHIprojectsMyModelbuild.xml:24: The following error occurred while executing this line:

C:Program FilesVHIprojectsMyModelbuild.xml:63: The following error occurred while executing this line:

C:Program FilesVHIprojectsMyModelbuild.xml:115: The following error occurred while executing this line:

C:Program FilesVHIprojectsMyModelbuild.xml:132: The following error occurred while executing this line:

C:Program FilesVHIprojectsMyModelbuild.xml:138: Can't get http://localhost/MyModel/MyModel.asmx?wsdl to C:Program FilesVHIprojectsMyModelwsdlMyModel.wsdl