{"id":134,"date":"2019-01-15T05:37:04","date_gmt":"2019-01-15T10:37:04","guid":{"rendered":"http:\/\/itblog.ldlnet.net\/?p=134"},"modified":"2019-01-15T05:37:04","modified_gmt":"2019-01-15T10:37:04","slug":"maxconcurrentapi-script-for-netlogon-issues","status":"publish","type":"post","link":"https:\/\/itblog.ldlnet.net\/index.php\/2019\/01\/15\/maxconcurrentapi-script-for-netlogon-issues\/","title":{"rendered":"MaxConcurrentAPI Script for Netlogon Issues"},"content":{"rendered":"\n<p>I get incidents from time to time that deal with Netlogon Service Issues. For example: Semaphore Waiters, Semaphore Timeouts, Semaphore Acquires, etc&#8230;<\/p>\n\n\n\n<p>Here is a script I got from the <em><a rel=\"noreferrer noopener\" aria-label=\"Microsoft Gallery (opens in a new tab)\" href=\"https:\/\/gallery.technet.microsoft.com\/scriptcenter\/Check-NTLM-MaxConcurrentApi-114547ad\" target=\"_blank\">Microsoft Gallery<\/a><\/em><br>In some enterprise environments the sheer volume of NTLM authentication can produce performance bottlenecks on servers. To help make the problem easier to detect, this PowerShell script was written.<\/p>\n\n\n<pre class=\"lang:PowerShell\" Title=\"CheckMaxConcurrentAPI.ps1\">PARAM ([Switch]$CheckMaxConcurrentApi, [switch]$GetNetlogonInstances, [string]$Computer = \"Localhost\", [string]$Instance = \"_Total\", [bool]$CalcMCA = $False)\n#************************************************\n# CheckMaxConcurrentApiScript.ps1\n# Version 1.0\n# Date: 3\/22\/2013\n# Author: Tim Springston [MSFT]\n# Description:Uses .Net methods and WMI to query\n#                a remote or local computer for MaxConcurrentApi\n#               problems and return details back in a PSObject.\n#************************************************\nfunction CheckMaxConcurrentApi ([string]$InstanceName = \"_Total\", [string]$ComputerName = \"localhost\", [bool]$Calc = $false)\n{   \n\t#This function takes three optional parameters to select Netlogon Instance (can be obtained by using\n\t#sister function GetNetlogonInstances, computer to run against and whether to run\n\t#MaxConcurrentApi calculation-which takes longer.\n    #It returns details about the computer, whether the problem is detected, and suggested MaxConcurrentApi value.\n\t$ProblemDetected = $false\n\t$Date = Get-Date\n\u00a0\n\t#Get role, OSVer, hotfix data.\n\t$cs =  gwmi -Namespace \"root\\cimv2\" -class win32_computersystem -Impersonation 3 -ComputerName $ComputerName\n\t$DomainRole = $cs.domainrole\n\t$OSVersion = gwmi -Namespace \"root\\cimv2\" -Class Win32_OperatingSystem -Impersonation 3 -ComputerName $ComputerName\n\t$bn = $OSVersion.BuildNumber\n\t$150Hotfix = $false\n\u00a0\n\t#Determine how long the computer has been running since last reboot.\n\t$wmi = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $ComputerName\n\t$LocalDateTime = $wmi.LocalDateTime\n\t$Uptime = $wmi.ConvertToDateTime($wmi.LocalDateTime) \u2013 $wmi.ConvertToDateTime($wmi.LastBootUpTime)\n\t$Days = $Uptime.Days.ToString()\n\t$Hours = $Uptime.Hours.ToString()\n\t$UpTimeStatement = $Days + \" days \" + $Hours + \" hours\"\n\u00a0\n\t#Get SystemRoot so that we can map the right drive for checking file versions.\n\t$objReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$ComputerName)\n\t$ObjRegKey = $ObjReg.OpenSubKey(\"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\")\n\t$SystemRoot = $ObjRegKey.GetValue(\"SystemRoot\")\n\u00a0\n\t#Parse the drive letter for the remote systemroot and then map the network drive. First though\n\t#make sure the drive you will map to doesnt exist already.\n\t$Drives = gwmi -Namespace \"root\\cimv2\"  -ComputerName $ComputerName -Impersonation Impersonate -Class Win32_LogicalDisk\n\t$DriveLetters = @()\n\tForEach ($Drive in $Drives)\n\t\t{\n\t\t  $Caption = $Drive.Caption\n\t\t  $DriveLetters += $Caption\n\t\t  $Caption = $null\n\t\t}\n\u00a0\n\tif ($ComputerName -ne \"localhost\")\n\t\t{\n\t\t\t$PossibleLetters = [char[]]\"DEFGHIJKLMNOPQRTUVWXY\" \n\t\t\t$devices = get-wmiobject win32_logicaldisk | select -expand DeviceID\n\t\t\t$PossibleLetters | where {$DriveLetters -notcontains \"$($_):\"} | Select -First 1 | % {\n\t\t\t$AvailableDriveLetter = $_\n\t\t\t}\n\t\t\t$DriveToMap = $SystemRoot\n\t\t\t$DriveToMap = $DriveToMap.Replace(\":\\Windows\",\"\")\n\t\t\t$DriveToMap = \"\\\\\" + $ComputerName + \"\\\" + $DriveToMap + \"$\"\n\t\t\t$AvailableDriveLetter = $AvailableDriveLetter  + \":\"\n\t\t\t$NETUSEReturn = net use $AvailableDriveLetter $DriveToMap\n\t\t\t$RemoteSystem32Folder = $AvailableDriveLetter + \"\\Windows\\System32\"\n\t\t\t$NetlogonDll = $RemoteSystem32Folder + \"\\Netlogon.dll\"\n\t\t}\n\t\telse\n\t\t\t{\n\t\t\t $NetlogonDll = $SystemRoot + \"\\System32\\Netlogon.dll\"\n\t\t\t}\n\u00a0\n\t#Check the file versions for the hotfixes.\n\t$FileVer = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($NetlogonDll).FileVersion\n\tswitch -exact ($bn)\n\t\t{\"6002\" {#Hotfix Check for MCA to 150 KB975363 http:\/\/support.microsoft.com\/kb\/975363\n\t\t\t\t $6002HotfixVer = \"6.0.6002.22289\"\n\t\t\t\t if ($6002HotfixVer -eq $FileVer)\n\t\t\t\t     {$150Hotfix = $true}\n\t\t\t\t}\n\t\t\"7600\" {#Hotfix Check for MCA to 150 KB975363 http:\/\/support.microsoft.com\/kb\/975363\n\t\t\t\t$7600HotfixVer = \"6.1.7600.20576\"\n\t\t\t\tif ($7600HotfixVer -eq $FileVer)\n\t\t\t\t\t{$150Hotfix = $true}\n\t\t\t\t}\n\t\t\"7601\" {#Hotfix Check for MCA to 150 KB975363 http:\/\/support.microsoft.com\/kb\/975363\n\t\t\t\t$150Hotfix = $true\n\t\t\t\t}\n\t\t}\n\tif ($ComputerName -ne \"localhost\")\n\t\t{\n\t\t$NETUSEReturn = net use $AvailableDriveLetter \/d\n\t\t}\n\u00a0\n\t#Determine effective MaxConcurrentApi setting based on OS, hotfix presence, role and registry setting.\n\t$objReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $ComputerName)\n\t$objRegKey= $objReg.OpenSubKey(\"SYSTEM\\\\CurrentControlSet\\\\services\\\\Netlogon\\\\Parameters\")\n\t$MCARegVal = $objRegKey.GetValue('MaxConcurrentApi')\n\t$CurrentMCA = 0\n\tif  ($DomainRole -gt 1)\n\t\t\t{    \n\t\t\tif ($bn -ge 9200)\n\t\t\t\t{\n\t\t\t\tIf (($MCARegVal -lt 10) -or ($MCARegVal -eq $null) -or ($MCARegVal -gt 9999))\n\t\t\t\t\t{$CurrentMCA = 10}\n\t\t\t\t\telseif (($MCARegVal -gt 10)    -and ($MCARegVal -lt 9999))\n\t\t\t\t\t\t{$CurrentMCA = $MCARegVal}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t{        \n\t\t\t\t\tIf (($MCARegVal -gt 10) -and ($150Hotfix -eq $true))\n\t\t\t\t\t\t{        \n\t\t\t\t\t\t$CurrentMCA = $MCARegVal}\n\t\t\t\t\t\telseif (($MCARegVal -gt 10) -and ($150Hotfix -eq $false))    \n\t\t\t\t\t\t\t{$CurrentMCA = 2}\n\t\t\t\t\t\t\telseif (( $MCARegVal -gt 2 ) -and ($MCARegVal -le 10))\n\t\t\t\t\t\t\t\t{$CurrentMCA = $MCARegVal}\n\t\t\t\t\t\t\t\telseif ($MCARegVal -lt 2)\n\t\t\t\t\t\t\t\t\t{$CurrentMCA = 2}\n\t\t\t\t\t\t\t\t\telseif ($MCARegVal -eq $null)\n\t\t\t\t\t\t\t\t\t\t{$CurrentMCA = 2}\n\t\t\t\t\t}\n\t\t\t\t}\n\u00a0\n\t#Get a sample of the counters.\n\t$Category = \"Netlogon\"\n\t$CounterASHT = \"Average Semaphore Hold Time\"\n\t$CounterST = \"Semaphore Timeouts\"\n\t$CounterSA = \"Semaphore Acquires\"\n\t$CounterSH = \"Semaphore Holders\"\n\t$CounterSW = \"Semaphore Waiters\"\n\t#Query remote computer for counters.\n\t$NetlogonRemoteASHT = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterASHT,$InstanceName,$ComputerName)\n\t$NetlogonRemoteST = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterST,$InstanceName,$ComputerName)\n\t$NetlogonRemoteSA = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSA,$InstanceName,$ComputerName)\n\t$NetlogonRemoteSW = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSW,$InstanceName,$ComputerName)\n\t$NetlogonRemoteSH = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSH,$InstanceName,$ComputerName)\n\t#Cook values\n\t$CookedASHT = $NetlogonRemoteASHT.NextValue()\n\t$CookedST = $NetlogonRemoteST.NextValue()\n\t$CookedSA = $NetlogonRemoteSA.NextValue()\n\t$CookedSW = $NetlogonRemoteSW.NextValue()\n\t$CookedSH = $NetlogonRemoteSH.NextValue()\n\tif ((($CookedSW -gt 0) -and (-not($CookedSW -gt 4GB))) -or ($CookedSH -eq $CurrentMCA) -or ((($CookedST -gt 0) -and (-not($CookedST -gt 4GB))) -and (($CookedSW -gt 0) -and (-not($CookedSW -gt 4GB)))))\n\t\t\t\t{$ProblemDetected = $true}\n\u00a0\n\t#Do a second data sample and compare results in order to run the \"suggested MCA\" math.\n\tif (($ProblemDetected -eq $true) -and ($Calc -eq $true))\n\t\t{\n\t\tStart-Sleep -Seconds 60\n\t\t$NetlogonRemoteASHT = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterASHT,$InstanceName,$ComputerName)\n\t\t$NetlogonRemoteST = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterST,$InstanceName,$ComputerName)\n\t\t$NetlogonRemoteSA = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSA,$InstanceName,$ComputerName)\n\t\t$NetlogonRemoteSW = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSW,$InstanceName,$ComputerName)\n\t\t$NetlogonRemoteSH = New-Object System.Diagnostics.PerformanceCounter($Category,$CounterSH,$InstanceName,$ComputerName)\n\t\t#Cook values\n\t\t$SecondCookedASHT = $NetlogonRemoteASHT.NextValue()\n\t\t$SecondCookedST = $NetlogonRemoteST.NextValue()\n\t\t$SecondCookedSA = $NetlogonRemoteSA.NextValue()\n\t\t$SecondCookedSW = $NetlogonRemoteSW.NextValue()\n\t\t$SecondCookedSH = $NetlogonRemoteSH.NextValue()\n\t\t#Next, calculate the suggested MCA \n\t                            #using formula from http:\/\/support.microsoft.com\/kb\/2688798\n\t                            #(semaphore_acquires + semaphore_timeouts) * average_semaphore_hold_time \/ time_collection_length =< New_MaxConcurrentApi_setting\n\t\t\t\t\t\t\t #subtract Sample1SA from Sample2SA = SampleSADelta\n\t\t\t\t\t\t\t $SampleSADelta = ($SecondCookedSA - $CookedSA)\n\t\t\t\t\t\t\t $SampleSTDelta = ($SecondCookedST - $CookedST)\n\t\t\t\t\t\t\t $ASHT = ($SecondCookedASHT + $CookedASHT)\n\t\t\t\t\t\t\t $SampleASHTDelta = ($ASHT \/ 2 )\n\t\t\t\t\t\t\t $SamplesDeltaSAST = ($SampleSADelta + $SampleSTDelta)\n\t\t\t\t\t\t\t $AllSampleDeltas = ($SampleASHTDelta * $SamplesDeltaSAST)\n\t\t\t\t\t\t     $AllSampleDeltas \/= 90\n\t\t\t\t\t\t\t $SuggestedMCA = $AllSampleDeltas\n\t\t\t\t\t\t\t $SuggestedMCA = \"{0:N0}\" -f $SuggestedMCA\n\t\t\t\t\t\t\t if ($SuggestedMCA -le 2)\n\t\t\t\t\t\t\t\t{$SuggestedMCA = $CurrentMCA}\n\t\t}\n\t#Create PSObject for returned data.\n\t$ReturnedData = New-Object PSObject\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Detection Time\" -value $Date\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Problem Detected\" -value $ProblemDetected\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Server Name\" -value $cs.Name\n\tif ($cs.DomainRole -le 1)\n\t\t{add-member -inputobject $ReturnedData  -membertype noteproperty -name \"Server Role\" -value \"Client\"}\n\tif (($cs.DomainRole -eq 3) -or ($cs.DomainRole -eq 2))\n\t\t{add-member -inputobject $ReturnedData  -membertype noteproperty -name \"Server Role\" -value \"Member Server\"}\n\tif ($cs.DomainRole -ge 4)\n\t\t{add-member -inputobject $ReturnedData  -membertype noteproperty -name \"Server Role\" -value \"Domain Controller\"}\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Domain Name\" -value $cs.Domain\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Operating System\" -value $OSVersion.Caption\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Time Since Last Reboot\" -value $UpTimeStatement\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Current Effective MaxConcurrentApi Setting\" -value $CurrentMCA\n\tif ($SuggestedMCA -eq $null)\n\t\t{add-member -inputobject $ReturnedData  -membertype noteproperty -name \"Suggested MaxConcurrentApi Setting (may be same as current)\" -value $CurrentMCA}\n\t\telse\n\t\t{add-member -inputobject $ReturnedData  -membertype noteproperty -name \"Suggested MaxConcurrentApi Setting (may be same as current)\" -value $SuggestedMCA}\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Current Threads in Use (Semaphore Holders)\" -value $CookedSH\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Clients Currently Waiting (Semaphore Waiters)\" -value $CookedSW\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Cumulative Client Timeouts (Semaphore Timeouts) \" -value $CookedST\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Cumulative MaxConcurrentApi Thread Uses (Semaphore Acquires)\" -value $CookedSA\n\tadd-member -inputobject $ReturnedData  -membertype noteproperty -name \"Duration of Calls (Avg Semaphore Hold Time)\" -value $CookedASHT\n\treturn $ReturnedData\n}\n\u00a0\nfunction GetNetlogonInstances ([string]$RemoteComputerName = \"localhost\")\n\t{\n\t #This function takes a computer name as input (default to local computer) and returns\n\t #the instances-analagous to secure channels-a computer has. \n\t #Format returned is \\\\hostname.domainname.com.\n\t \n\t if ($RemoteComputerName -eq $null)\n\t     {\n\t\t$LocalNetlogon = New-Object System.Diagnostics.PerformanceCounterCategory(\"Netlogon\",$RemoteComputerName)\n\t\t$LocalInstances = $LocalNetlogon.GetInstanceNames()\n\t    $AllLocalInstances = @()\n\t\tforeach ($LocalInstance in $LocalInstances)\n\t\t\t{    \n\t          if ($LocalInstance -ne \"_total\")\n\t             {\n\t\t\t\t $AllLocalInstances += $LocalInstance\n\t\t\t\t}         \n\t\t\t} \n\t\t\tif ($AllLocalInstances -eq $null)\n\t\t\t\t{\n\t\t\t\tWriteTo-StdOut \"The local computer was missing its DC perf instance so getting DC name from WMI.\" -shortformat\n\u00a0\n\t\t\t\t$Query = \"select * from win32_ntdomain where description = '\" + $env:userdomain + \"'\"\n\t\t\t\t$v2 = get-wmiobject -query $Query\n\t\t\t\t$DCName = $v2.DomainControllerName\n\t\t\t\t$AllLocalInstances += $DCName\n\t\t\t\tWriteTo-StdOut \"DCName is $AllLocalInstances\" -shortformat\n\t\t\t\t}\n\t\treturn $AllLocalInstances\n\t\t}\n\t\telse\n\t\t{\n\t\t$RemoteNetlogon = New-Object System.Diagnostics.PerformanceCounterCategory(\"Netlogon\",$RemoteComputerName)\n\t\t$RemoteInstances = $RemoteNetlogon.GetInstanceNames()\n\t\t$AllRemoteInstances = @()\n\t\tforeach ($RemoteInstance in $RemoteInstances)\n\t\t\t{    \n\t          if ($RemoteInstance -ne \"_Total\")\n\t             {\n\t\t\t\t $AllRemoteInstances += $RemoteInstance\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($AllRemoteInstances -eq $null)\n\t\t\t\t{\n\t\t\t\t#If the local computer was missing its DC perf instance so getting DC name from WMI.\n\t\t\t\t$Query = \"select * from win32_ntdomain where description = '\" + $env:userdomain + \"'\"\n\t\t\t\t$v2 = get-wmiobject -query $Query\n\t\t\t\t$DCName = $v2.DomainControllerName\n\t\t\t\t$AllRemoteInstances += $DCName\n\t\t\t\t}\n\t\treturn $AllRemoteInstances\n\t\t}\n\t}\n\u00a0\nif (($CheckMaxConcurrentApi) -and ($Instance -ne \"_Total\") -and ($Computer -ne \"Localhost\") -and ($CalcMCA -eq $true))\n\t{CheckMaxConcurrentApi -instancename $Instance -ComputerName $Computer -Calc $CalcMCA  | FL }\nelseif (($CheckMaxConcurrentApi) -and ($Instance -ne \"_Total\") -and ($Computer -ne \"Localhost\"))\n\t{CheckMaxConcurrentApi -instancename $Instance -ComputerName $Computer | FL }\nelseif (($CheckMaxConcurrentApi) -and ($Instance -ne \"_Total\"))\n\t{CheckMaxConcurrentApi -instancename $Instance  | FL}\nelseif (($CheckMaxConcurrentApi) -and ($Computer -ne \"Localhost\"))\n\t{CheckMaxConcurrentApi -ComputerName $Computer  | FL}\nelseif (($CheckMaxConcurrentApi) -and ($CalcMCA -eq $true))\n\t{CheckMaxConcurrentApi -Calc $calcmca  | FL}\nelseif ($CheckMaxConcurrentApi)\n\t{CheckMaxConcurrentApi | FL}\nif (($GetNetlogonInstances) -and ($Computer -ne \"Localhost\"))\n\t{GetNetlogonInstances  | FL}\nelseif ($GetNetlogonInstances) \n{GetNetlogonInstances -RemoteComputerName $Computer | FL}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Execution:<\/h3>\n\n\n\n<p class=\"has-small-font-size\">Now, I modified this script taking out the clear screen parameter so that I could be run against multiple servers. Place the script in your Scripts directory and name it CheckMaxConcurrentApiScript.ps1<\/p>\n\n\n\n<p class=\"has-small-font-size\">First, in PowerShell,\ngather your list of servers:<\/p>\n\n\n<pre class=\"lang:PowerShell\">$DCList = Get-ADDomainController -Filter * | Sort-Object Name | Select-Object Name<\/pre>\n\n\n\n<p class=\"has-small-font-size\"><em>Or<\/em><\/p>\n\n\n<pre class=\"lang:PowerShell\">$EXList = Get-ExchangeServer | Sort-Object Name | Select-Object Name<\/pre>\n\n\n\n<p class=\"has-small-font-size\">Next, run the command to run the ps1 against those servers:<\/p>\n\n\n<pre class=\"lang:PowerShell\">foreach ($DC in $DCList) { $DC.Name ; Invoke-Command -Command {C:\\Scripts\\CheckMaxConcurrentApiScript.ps1 -checkmaxconcurrentapi -Computer $DC.Name -CalcMCA $true} }<\/pre>\n\n\n\n<p class=\"has-small-font-size\"><em>Or<\/em><\/p>\n\n\n<pre class=\"lang:PowerShell\">foreach ($EX in $EXList) { $EX.Name ; Invoke-Command -Command {C:\\Scripts\\CheckMaxConcurrentApiScript.ps1 -checkmaxconcurrentapi -Computer $EX.Name -CalcMCA $true} }<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Sample Output:<\/h3>\n\n\n\n<p class=\"has-text-color has-small-font-size has-bright-blue-color\"><strong>DC03<\/strong><br><strong>Detection Time : 12\/13\/2018 7:56:16 PM<\/strong><br><strong>Problem Detected : False<\/strong><br><strong>Server Name : DC03<\/strong><br><strong>Server Role : Domain Controller<\/strong><br><strong>Domain Name : ldlnet.org<\/strong><br><strong>Operating System : Microsoft Windows Server 2008 R2 Enterprise<\/strong><br><strong>Time Since Last Reboot : 4 days 22 hours<\/strong><br><strong>Current Effective MaxConcurrentApi Setting : 10<\/strong><br><strong>Suggested MaxConcurrentApi Setting (may be same as current) : 10<\/strong><br><strong>Current Threads in Use (Semaphore Holders) : 0<\/strong><br><strong>Clients Currently Waiting (Semaphore Waiters) : 0<\/strong><br><strong>Cumulative Client Timeouts (Semaphore Timeouts) : 17<\/strong><br><strong>Cumulative MaxConcurrentApi Thread Uses (Semaphore Acquires) : 3493999<\/strong><br><strong>Duration of Calls (Avg Semaphore Hold Time) : 0<\/strong><\/p>\n\n\n\n<p style=\"color:#4fc040\" class=\"has-text-color has-small-font-size\"><strong>EXCH02<\/strong><br><strong>Detection Time : 12\/13\/2018 8:00:53 PM<\/strong><br><strong>Problem Detected : False<\/strong><br><strong>Server Name : EXCH02<\/strong><br><strong>Server Role : Member Server<\/strong><br><strong>Domain Name : ldlnet.org<\/strong><br><strong>Operating System : Microsoft Windows Server 2008 R2 Standard<\/strong><br><strong>Time Since Last Reboot : 4 days 23 hours<\/strong><br><strong>Current Effective MaxConcurrentApi Setting : 10<\/strong><br><strong>Suggested MaxConcurrentApi Setting (may be same as current) : 10<\/strong><br><strong>Current Threads in Use (Semaphore Holders) : 0<\/strong><br><strong>Clients Currently Waiting (Semaphore Waiters) : 0<\/strong><br><strong>Cumulative Client Timeouts (Semaphore Timeouts) : 570<\/strong><br><strong>Cumulative MaxConcurrentApi Thread Uses (Semaphore Acquires) : 1682257<\/strong><br><strong>Duration of Calls (Avg Semaphore Hold Time) : 0<\/strong><\/p>\n\n\n\n<p>Hopefully, this script will assist you with gathering the needed information to help you balance the netlogon load between your servers when needed in your environment. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"text-align:center\">HAPPY TROUBLESHOOTING!<\/h3>\n","protected":false},"excerpt":{"rendered":"<p>I get incidents from time to time that deal with Netlogon Service Issues. For example: Semaphore Waiters, Semaphore Timeouts, Semaphore Acquires, etc&#8230;<\/p>\n<p class=\"link-more\"><a class=\"myButt \" href=\"https:\/\/itblog.ldlnet.net\/index.php\/2019\/01\/15\/maxconcurrentapi-script-for-netlogon-issues\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":136,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,2,3,16],"tags":[41,54,8,13,20],"class_list":["post-134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-active-directory","category-general","category-powershell","category-windows","tag-active-directory","tag-netlogon","tag-powershell","tag-script","tag-windows","odd"],"_links":{"self":[{"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/posts\/134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":2,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/posts\/134\/revisions"}],"predecessor-version":[{"id":137,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/posts\/134\/revisions\/137"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/media\/136"}],"wp:attachment":[{"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/media?parent=134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/categories?post=134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itblog.ldlnet.net\/index.php\/wp-json\/wp\/v2\/tags?post=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}