<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Ivanti Blog: Posts by </title><description /><language>en</language><atom:link rel="self" href="https://www.ivanti.com/blog/authors/matt-walsh/rss" /><link>https://www.ivanti.com/blog/authors/matt-walsh</link><item><guid isPermaLink="false">8e12992a-b507-48f5-8403-e4bd197d7fbe</guid><link>https://www.ivanti.com/blog/an-introduction-to-appsense-apis-environment-manager-configuration-api-part-ii</link><atom:author><atom:name>Matt Walsh</atom:name><atom:uri>https://www.ivanti.com/blog/authors/matt-walsh</atom:uri></atom:author><category>Security</category><category>Endpoint Management</category><category>Supply Chain</category><title>Environment Manager Configuration Part 2</title><description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;*This post originally appeared on the AppSense blog prior to the &lt;a href="https://www.ivanti.com/company/press-releases/2017/landesk-and-heat-are-now-ivanti" target="_blank" rel="noopener"&gt;&lt;span class="s2"&gt;rebrand in January 2017&lt;/span&gt;&lt;/a&gt;, when AppSense, LANDESK, Shavlik, Wavelink, and HEAT Software merged under the new name Ivanti.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" target="_blank" rel="noopener"&gt;&lt;img class=" size-full wp-image-11391 alignleft" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" alt="Blog_Banners_main-page[1]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in my last blog I introduced you to the Configuration API, I explained how to create the basic structure of a configuration with associated options and settings.&amp;nbsp; In this blog I will cover creating actions and conditions on various triggers.&amp;nbsp; Covering the whole conditions &amp;amp; actions set in this blog will be just too long and drawn out, so to keep things interesting I’ve compacted it down to just cover the most common we see in configuration files.&amp;nbsp; Hopefully this will keep you interested and more importantly will allow you to learn as you go.&lt;/p&gt;
&lt;p&gt;So to kick things off lets pick up where we left off last time.&lt;/p&gt;
&lt;p&gt;Let’s recall our basic structure.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;In a standard configuration the Parent-Child relationship needs to be maintained and is maintained with the use of GUID’s throughout the configuration.&amp;nbsp; Therefore each condition or action is created using its Parents GUID.&lt;/i&gt;&lt;/p&gt;
&lt;h3&gt;Conditions&lt;/h3&gt;
&lt;p&gt;Getting to the nitty gritty of it all, let’s create a UserIsAdmin condition under the child node of the ‘User Pre-Desktop’ trigger&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
#&amp;nbsp; Add a node to the User Pre-Desktop trigger named 'Node Pre-Desktop'&lt;br&gt;
$userpredesktopnodeid = $config.AddNodeToTrigger("UserPreDesktop", "Node Pre-Desktop")&lt;/p&gt;
&lt;p&gt;#&amp;nbsp; Add a child node to the node created above using its NodeID variable.&lt;br&gt;
$predesktopchildnode1 = $config.AddNodeToParent($userpredesktopnodeid, "Child Node")&lt;/p&gt;
&lt;p&gt;#&amp;nbsp; Create as IsAdministrator Condition&lt;br&gt;
$config.AddActionOrCondition($predesktopchildnode1, $isAdminCondition_true)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;p&gt;To explain this code above lets break it down line by line.&amp;nbsp; First things first we need to create the ‘UserIsAdministrator’ API constructor in which we declare what parameters are passed.&amp;nbsp; In this case it simply is as follows:-&lt;/p&gt;

&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#8FD300"&gt;&lt;span&gt;UserIsAdministrator&lt;strong&gt;(bool isAdministrator, bool evaluateOnce, bool stopIfFails)&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;**Remember PowerShell is ran line by line as opposed to compiled, so constructors have to be declared in code before they can be called.&amp;nbsp; This seems obvious, however it is quite easy to miss structure your code and fall into this trap.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Translating to the following line of code:-&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
#&amp;nbsp; Create the Condition Object&lt;br&gt;
$isAdminCondition_true = New-Object EMConfigAPI.Conditions.UserIsAdministrator($true, $true, $false)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;p&gt;Next we have to add the Condition to the node we want:-&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
#&amp;nbsp; Add a child node to the node created above using its NodeID variable.&lt;br&gt;
$predesktopchildnode1 = $config.AddNodeToParent($userpredesktopnodeid, "Child Node")&lt;/p&gt;
&lt;p&gt;#&amp;nbsp; Create as IsAdministrator Condition&lt;br&gt;
$config.AddActionOrCondition($predesktopchildnode1, $isAdminCondition_true)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;p&gt;So to look at this programmatically, we call the AddActionOrCondition API with the first parameter being the parent node of the node you wish to add the object to and the second is the actual variable of the condition or action.&lt;/p&gt;
&lt;h3&gt;Actions&lt;/h3&gt;
&lt;p&gt;The same logic is used for actions.&amp;nbsp; Firstly using the API constructor we create the object variable&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#8FD300"&gt;&lt;span&gt;DriveMap(string driveLetter, string remotePath, bool unMapAtLogoff, ConnectAs connectAs, string userFriendlyName, bool stopIfFails)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td bgcolor="#8FD300"&gt;&lt;span&gt;DriveMap(string driveLetter, string remotePath, bool unMapAtLogoff)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notice this API uses a ‘Connect As’ Enumerator.&amp;nbsp; In instances like these only a pre-defined input can be used.&amp;nbsp; In this case it is &lt;strong&gt;CurrentUser&lt;/strong&gt;, &lt;strong&gt;System&lt;/strong&gt;, &lt;strong&gt;AsUser&lt;/strong&gt; or &lt;strong&gt;Default&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
$driveMap_E = New-Object EMConfigAPI.Actions.DriveMap("E", "\\server\share", $true)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;p&gt;Finally we add the action to the appropriate parent object.&amp;nbsp; In this example I have added it to the ‘UserIsAdministrator’ condition created earlier.&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
$childnode1_drivemap = $config.AddActionOrCondition($childnode1_isAdmin_true, $driveMap_E)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;h3&gt;Reuseable Nodes &amp;amp; Conditions&lt;/h3&gt;
&lt;p&gt;Reuseable’s work in much the same way, however utilize a slightly different API.&lt;/p&gt;
&lt;p&gt;[code lang="powershell"]&lt;br&gt;
$reusable_osIs81Condition = $config.InsertReusableConditionNode("OS is Windows 8.1")&lt;/p&gt;
&lt;p&gt;$w81Condition = $config.AddActionOrCondition($reusable_osIs81Condition, $osIsW81)&lt;/p&gt;
&lt;p&gt;$reusable_OS81Node = $config.InsertReusableNode("OS Check 8.1")&lt;/p&gt;
&lt;p&gt;$osCondition = $config.AddReusableCondition($reusable_OS81Node, $reusable_osIs81Condition)&lt;br&gt;
[/code]&lt;/p&gt;
&lt;p&gt;This time the extra step is to Insert the reusable object in the library, using the &lt;i&gt;InsertReusableConditionNode&lt;/i&gt; &amp;amp; &lt;i&gt;InsertReusableNode&lt;/i&gt; API’s.&amp;nbsp; Then we create the action object and then link it to the appropriate object in the configuration.&lt;/p&gt;
&lt;p&gt;I hope everyone has followed up until this point, however I appreciate just reading isolated lines of code can be difficult to relate to real world examples.&amp;nbsp; That is why I have bundled together a script which contains a lot more working examples for actions and conditions.&lt;/p&gt;
&lt;p&gt;Once again this is not a fully optimized script, just an example of how objects are linked together and to show what is required to generate a configuration.&lt;/p&gt;
&lt;p&gt;Again I hope that this has given you some food for thought and please feel free to comment if there is any need for clarification.&lt;/p&gt;</description><pubDate>Fri, 22 Apr 2016 07:31:34 Z</pubDate></item><item><guid isPermaLink="false">287e883b-f70c-491e-9dc1-d63be9bc0d89</guid><link>https://www.ivanti.com/blog/desktopnow-java-virtual-machines-jvms</link><atom:author><atom:name>Matt Walsh</atom:name><atom:uri>https://www.ivanti.com/blog/authors/matt-walsh</atom:uri></atom:author><category>Security</category><category>Endpoint Management</category><category>Supply Chain</category><title>DesktopNow &amp; Java Virtual Machines (JVM’s)</title><description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;*This post originally appeared on the AppSense blog prior to the &lt;a href="https://www.ivanti.com/company/press-releases/2017/landesk-and-heat-are-now-ivanti" target="_blank"&gt;&lt;span class="s2"&gt;rebrand in January 2017&lt;/span&gt;&lt;/a&gt;, when AppSense, LANDESK, Shavlik, Wavelink, and HEAT Software merged under the new name Ivanti.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" target="_blank" rel="noopener"&gt;&lt;img class=" size-full wp-image-11391 alignleft" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" alt="Blog_Banners_main-page[1]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last time I started you off with a nice easy blog around troubleshooting. &amp;nbsp;Now it’s time to venture deeper&amp;nbsp;down the rabbit hole.&lt;/p&gt;
&lt;p&gt;Let’s take a look at how our&amp;nbsp;DesktopNow suite interacts with Java applications.&lt;/p&gt;
&lt;p&gt;We have seen a trend of issues reporting that Java applications will no longer launch when either AM or EM has&amp;nbsp;been upgraded. So I think it’s worth delving a little deeper into and explain what's occurring.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/screen-shot-2015-05-26-at-2.58.30-pm.png" target="_blank" rel="noopener"&gt;&lt;img class=" wp-image-11740 aligncenter" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/screen-shot-2015-05-26-at-2.58.30-pm.png" alt="Screen Shot 2015-05-26 at 2.58.30 PM"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before I start to explore the issues in technical detail, first I should explain at a high-level how Java environments are created. Most people who are admins have heard of the phrase Java Virtual Machine or JVM, but I bet most haven’t stopped to think, "Why on earth is it called that?" Well, It's because Java actually does run in the same principle as any other virtual machine, at least in memory reservation. Resources need to be assigned or reserved before the machine is started. This means that the memory ‘heap’ is first reserved, a small proportion is allocated, and then the ‘machine’ is started. Now those of you who regularly use Java applications in your environment will know that Java can be ran with a number of switches, particularly:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Command line options:&lt;/strong&gt; -Xms:&amp;lt;min size&amp;gt; &lt;strong&gt;-Xmx:&lt;/strong&gt;&amp;lt;max size&amp;gt;&lt;/p&gt;
&lt;p&gt;The -Xmx switch is the one we need to focus on as it sets the maximum heap size for the JVM.&lt;/p&gt;
&lt;table border="0" cellspacing="3" cellpadding="3"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp999528" target="_blank" rel="noopener"&gt;-Xmx&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This option sets the maximum Java heap size. The Java heap (the “heap”) is the part of the memory where blocks of memory are allocated to objects and freed during garbage collection. Depending upon the kind of operating system you are running&amp;nbsp;&lt;span&gt;the maximum value you can set for the Java heap can vary.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp999527" target="_blank" rel="noopener"&gt;-Xms&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The -Xms option sets the initial and minimum Java heap size. The Java heap (the “heap”) is the part of the memory where blocks of memory are allocated to objects and freed during garbage collection.&lt;strong&gt;Note:&lt;/strong&gt; -Xms does not limit the total amount of memory that the JVM can use.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Java will try to allocate a single contiguous block of memory upon each launch (although opinion seems to differ, seeming dependent on which JVM &lt;a href="https://en.wikipedia.org/wiki/Java_virtual_machine" target="_blank" rel="noopener"&gt;specification&lt;/a&gt; is used). When the –Xmx switch is used, you are effectively specifying the maximum amount of memory and therefore the size of the block that requires reserving. Ideally applications should be profiled to understand their memory requirements.&lt;/p&gt;
&lt;p&gt;Generally these types of issue occur more frequently when using a 32-bit JVM. Primarily this is due to the limited amount of heap memory available within this architecture. The OS defaults to 2GB process or ‘User’ address space and the other 2GB for ‘Kernel’ or system processes, however this can be changed. 64-bit processes do not have such architectural limitation as the address spaces are chasmic in comparison at 8TB (Terabytes) for both User and Kernel address space. This is increased again to 128TB in Windows 8.1 and Server 2012 R2.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/win32/memory/memory-limits-for-windows-releases" target="_blank" rel="noopener"&gt;Memory Limits for Windows and Windows Server Releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s easy to forget when talking about applications and their interactions that this is in the highest level of the OS stack. In this case, the issue emanates from a lot lower down in the stack. We are talking about how memory is allocated across the entire system, not just for applications. Therefore knowledge at this lower level is required for a true understanding of the issue.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/screen-shot-2015-05-26-at-4.25.18-pm.png" target="_blank" rel="noopener"&gt;&lt;img class="aligncenter wp-image-11743" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/screen-shot-2015-05-26-at-4.25.18-pm.png" alt="Screen Shot 2015-05-26 at 4.25.18 PM"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With the issues we have seen here, the primary reason is that the AM, EM and related Microsoft libraries (DLL’s) are loading into an empty memory before Java is&amp;nbsp;loaded. This fragments the free memory space available to Java when its starts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Known Issues&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Technically there are 3 distinct issues caused all in principle by the same root cause outlined above.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Application Manager - AMAppHook.dll &amp;amp; AmLdrAppInit.dll are loaded into a static shared memory address, 0x67C00000 &amp;amp; 0x67CF0000 respectively. Technically this is in no way incorrect, however it causes a fragmented memory region.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/untitled.png" target="_blank" rel="noopener"&gt;&lt;img class=" wp-image-11744 aligncenter" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/untitled.png" alt="Untitled"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;With the arrival EM 8.5 and AM 8.8 we introduced a new version of &lt;a href="https://www.microsoft.com/en-us/research/project/detours/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fprojects%2Fdetours%2F" target="_blank" rel="noopener"&gt;Microsoft Detours&lt;/a&gt; which forced allocations into an earlier memory address space causing more fragmentation of available free space than in previous versions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Detours library enables interception of function calls with user-defined calls. The first few instructions of the target function with an unconditional jump to the user-provided detour function. Instructions from the target function are preserved in a trampoline function. &amp;nbsp;The trampoline consists of the instructions removed from the target function and an unconditional branch to the remainder of the target function.&lt;/p&gt;
&lt;p&gt;In layman's terms, Detours allows you to insert your own functional calls to replace or extend the target function. The original target functions code is placed in a function called a ‘trampoline’, which can be called after the newly defined user-provided function.&lt;/p&gt;
&lt;p&gt;The trampoline function is the key, as with any other object, as it requires a memory allocation. Detours use a complex algorithm to allocate this function's memory. The algorithm was seen to be allocating memory 1GB above or below the target library when the issue occurred. When the Java application failed, this allocation was in the middle of the memory block that the JVM was attempting to allocate and so in turn failed its memory allocation.&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Detours uses a start address that needs to be below where the system DLL’s are located. Using a top-down allocation approach it works down through the memory ranges until a large enough free-block is found. In version 2.1 the address space is high up in the memory spectrum at 0x70000000. Beyond this range the ‘system DLL’s are loaded. As Operating Systems are becoming increasing more complex the number of system DLL’s is increasing, needing a larger proportion of reserved address space. In version 3.0 of Detours Microsoft changed the starting address space further down the spectrum at 0x50000000 which now coincidentally aligns with the ASLR (Address Space Layout Randomization) address range. Any trampoline functions are loaded in below this function, again increasing the likelihood of memory fragmentation problems under certain circumstances.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Applied Optimizations&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Code optimization will reduce the occurrences for these types of issues. In Application Manager 8.9 Service Pack 1 the Application Manager modules have been ASLR enabled.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This will randomize the memory allocation, between 0x50000000 &amp;amp; 0x78000000 upon each system boot. Now for those of you paying attention you might be saying that ‘&lt;em&gt;Hang on,&lt;/em&gt; &lt;em&gt;0x50000000 is lower than 0x67C00000! So the issue will still occur?&lt;/em&gt; ‘Correct, well half-way at least. The ASLR implementation means that each allocation is completed top-down, so the address ranges at the very top of the memory spectrum are more than likely ASLR enabled. Below is a representation of my workstations Memory heap, from this you can see that from 0x76EA0000 &amp;gt; 0x6E5E0000 each ‘Image’ has been tagged with an ASLR flag.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/untitled1.png" target="_blank" rel="noopener"&gt;&lt;img class="aligncenter wp-image-11745" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/05/untitled1.png" alt="Untitled1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Further optimization in the form of a delay configurable via the Console &amp;gt; ‘Custom Settings &amp;gt; AppHookDelayLoad’ have been added into this release to delay the Application Manager Hook.&amp;nbsp; This will to allow Java to allocate it's memory before Application Manager or Microsoft Detours reducing the likelihood of a fragmented memory region.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Working with Microsoft it was validated that this behaviour was due to a change in the Detours source code. A solution has been implemented to optimize the code base for 32-bit versions in
&lt;ul&gt;
&lt;li&gt;Environment Manager 8.5 Service Pack 1 Agent Hotfix&amp;nbsp;5 - &lt;a href="https://www.myappsense.com/Knowledgebase/TN-151461.aspx" target="_blank" rel="noopener"&gt;TN-151461&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Application Manager 8.8 Agent Hotfix 1 - &lt;a href="https://www.myappsense.com/Knowledgebase/TN-151205.aspx" target="_blank" rel="noopener"&gt;TN-151205&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;There are currently no optimizations in place to reduce occurrences of these type of issues; however I would stress that there have been no reported cases attributed to it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Summary&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To sum up, under normal working conditions the Operating System can handle fragmented memory space well and without any performance impact. Java specifications can differ, but 32-bit applications created using a specification that architecturally requires a contiguous reservation will more than likely meet this issue one day or another. Unfortunately for application vendors such as AppSense, there is no quick fix or win to help our customers. All we can attempt to do is optimize our components as efficiently as possible to reduce occurrences and maximize the available memory for these applications.&lt;/p&gt;</description><pubDate>Tue, 26 May 2015 21:30:11 Z</pubDate></item><item><guid isPermaLink="false">ff40a685-c374-41a7-b341-c5272a808fc6</guid><link>https://www.ivanti.com/blog/helping-us-help-you-appsense-troubleshooting-best-practices</link><atom:author><atom:name>Matt Walsh</atom:name><atom:uri>https://www.ivanti.com/blog/authors/matt-walsh</atom:uri></atom:author><category>Security</category><category>Endpoint Management</category><category>Supply Chain</category><title>Helping Us Help You: AppSense Troubleshooting Best Practices</title><description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;*This post originally appeared on the AppSense blog prior to the &lt;a href="https://www.ivanti.com/company/press-releases/2017/landesk-and-heat-are-now-ivanti" target="_blank"&gt;&lt;span class="s2"&gt;rebrand in January 2017&lt;/span&gt;&lt;/a&gt;, when AppSense, LANDESK, Shavlik, Wavelink, and HEAT Software merged under the new name Ivanti.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" target="_blank" rel="noopener"&gt;&lt;img class="alignnone size-full wp-image-11391" src="https://static.ivanti.com/sites/marketing/media/images/blog/2015/02/blog_banners_main-page1.png" alt="Blog_Banners_main-page[1]"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a Senior Solutions Engineer, I see many high priority / high impact issues that require detailed analysis of a complex set of moving parts.&amp;nbsp; This often includes memory dump analysis, in-depth log analysis, cross-platform interoperability issues, and generally finding creative solutions to tricky problems. The urgency and complexity of these situations requires me to work in an efficient environment. I like to be organized enough that if I need to reach for a resource, I know exactly where it is. If I can’t, quite frankly, it ‘drives me up the wall’ with frustration.&lt;/p&gt;
&lt;p&gt;I’m sure that many reading this relate to this feeling and think, “Well, duh! Doesn’t everyone?”&amp;nbsp; Well actually, no, not intentionally. When a high-pressure situation occurs, sometimes the simplest and easiest things that can make our lives easier can be overlooked. We all do it on a daily basis in one way or another in all aspects of life.&lt;/p&gt;
&lt;p&gt;My goal is always to take a structured approach to troubleshooting.&amp;nbsp; Where there’s structure, there’s efficiency. Microsoft provides an excellent article relating to &lt;a href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc786052(v=ws.10)" target="_blank" rel="noopener"&gt;‘Troubleshooting Methodology’&lt;/a&gt;that outlines some clear and distinct phases of the troubleshooting process.&lt;/p&gt;
&lt;p&gt;One of my pet hates is seeing or dealing with incidents where there is unnecessary “to’ing and fro’ing” back to customers asking for more information or gathering more logs. Unfortunately, some of the time it is a necessity, but other times the information could have been captured much earlier in the incident.&lt;/p&gt;
&lt;p&gt;Logging a call with a software vendor is one of those times when you really need the process of to be as smooth and painless as possible. (Normally, because your boss is breathing down your neck, right? I remember those times well! ).&amp;nbsp; It’s really important to ensure that the right information gets to the right people as soon as possible. Fortunately, we’ve developed a set of tools and tips over time that can make this process easier and much more efficient for our customers.&lt;/p&gt;
&lt;p&gt;By the time I generally see issues, they have often reached Phase 4 of the methodology mentioned above. However, it’s common for more ‘Discovery’ to be required, which is time consuming from both the vendor’s point of view and the customer side as well. So reducing this amount of time is a must to create an efficient working environment and, more importantly, reduce incident time-to-resolution (TTR) for our customers.&lt;/p&gt;
&lt;p&gt;Think about your past support interactions with AppSense and other software vendors and ask yourself a question: &lt;em&gt;“After I have logged an incident, do I then get asked a lot of ‘non-specific’ questions?”&lt;/em&gt; If the answer is ‘yes,’ how much of that could have been provided at the point the first call or e-mail was made? The likely answer is a fair amount.&lt;/p&gt;
&lt;p&gt;It’s in the best interests of both AppSense and you as a customer that we spend as much time as possible in troubleshooting (Phases 3, 4 &amp;amp; 5). This tends to go very smoothly with an efficient and collaborative approach, where all parties’ primary goal is to resolve the issues(s) reported by getting to root-cause.&lt;/p&gt;
&lt;p&gt;Typically every support vendor has a minimum list of things that are required at the point of incident. Here at AppSense, we don’t impose a rigid list, but we do have a general list of information we will ask for, if they haven’t been provided at first point of contact:&lt;/p&gt;
&lt;p&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppSense Support Toolkit – Data Collection Output (Formally the Support Script)&lt;sup&gt;1, 2&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product debug logs – (identifying problem sessions where applicable)&lt;/p&gt;
&lt;p&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Detailed reproduction steps or events building up to when the problem occurred&lt;/p&gt;
&lt;p&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Personalization Server Export (for Environment Manager Personalization incidents only)&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt;Data Collection - This feature collects AppSense configurations, event, registry and file information details to aid support troubleshoot the issue.; &lt;sup&gt;2&lt;/sup&gt;We are planning on expanding the AppSense Support Toolkit to be the ‘go to’ place of all support related utilities, so watch this space for further details!;&lt;sup&gt;3&lt;/sup&gt; All of our products have detailed logging which can be toggled on/off.&lt;/p&gt;
&lt;p&gt;If the AppSense Support Toolkit – Data Collection (AST-DC) or Personalization Server Export output has been provided recently (~3 months) and is still relevant, then clearly it is not required again. Simply reference any previous incident numbers and the information can be retrieved.&lt;/p&gt;
&lt;p&gt;Below I’ve included links to common tools that support will most likely ask you to use (dependent on products installed) after an incident has been logged:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Support Tools&lt;/strong&gt;&lt;br&gt;
AppSense Support Toolkit&lt;/p&gt;
&lt;table border="0" cellspacing="3" cellpadding="3"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment Manager Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Application Manager Agent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.5 EMLoggers85.zip&lt;br&gt;
8.4 EMLoggers84.zip&lt;br&gt;
8.3 EMLoggers83.zip&lt;br&gt;
Console Logging&lt;br&gt;
TN-150485&lt;/td&gt;
&lt;td&gt;8.8 AMLoggers88.zip&lt;br&gt;
8.7 AMLoggers87.zip&lt;br&gt;
8.6 AMLoggers86.zip&lt;br&gt;
Rules Analyzer Logging&lt;br&gt;
TN-150988&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance Manager Agent&lt;/strong&gt;&lt;br&gt;
TN-151463&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client Communications Agent&lt;/strong&gt;&lt;br&gt;
TN-150830&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ideally, the best sets of logs are the ones that are a combination of items that can be chronologically matched.&amp;nbsp; They are even more useful when combined with third party utilities such as the Sysinternals suite from Microsoft: https://technet.microsoft.com/en-gb/sysinternals/bb545021.aspx&lt;/p&gt;
&lt;p&gt;For example, the following are some sample support scenarios with corresponding example of the log data that is key to successful troubleshooting.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;Example 1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Issue Symptom: EM Personalization Settings are not synchronizing on application stop.&lt;/p&gt;
&lt;p&gt;Required Logs: AST-DC Output; EM Agent Logs; PS Export.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;Example 2&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Symptom: AM is blocking files through a proxy when I my configuration should allow it.&lt;/p&gt;
&lt;p&gt;Required Logs: AST-DC Output; AM Agent Logs; AM Rules Analyzer Log&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;Example 3&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Symptom: EM Console crashes when doing x,y,z.&lt;/p&gt;
&lt;p&gt;Required Logs: AST-DC Output; EM Console Logs&lt;/p&gt;
&lt;p&gt;Each situation is a little bit different, but providing a relevant set of logs will help up quickly and efficiently process your incident. While we hope you won’t ever need to contact us for help, if you do, taking that little extra time upfront goes a long way towards expediting the resolution of your incident. And that’s good for everyone.&lt;/p&gt;
&lt;p&gt;Watch out for additional troubleshooting tips and tricks – coming soon to the AppSense blog!&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2015 17:05:56 Z</pubDate></item></channel></rss>