increasing speed of 'Sources using Powershell Remote Sessions


Cole McDonald
 Share

Recommended Posts

TLDR: don't load session profiles when using Powershell Remote.  Use an explicit pssession with the -nomachineprofile flag present.

Several LM provided 'Sources use it.  Many of the 'Sources I've written in the past use it as well.  Here's the find/replace for the LM provided ones (find & replace are separated into comment regions):

#region FIND
try {
    #-----Determin the type of query to make-----
    # check to see if this is monitoring the localhost collector, as we will not need to authenticate.
    if ($hostname -like $collectorName) {
        $response = Invoke-Command -ScriptBlock $scriptBlock
    }
    # are wmi user/pass set -- e.g. are these device props either not substiuted or blank
    elseif (([string]::IsNullOrWhiteSpace($wmi_user) -and [string]::IsNullOrWhiteSpace($wmi_pass)) -or (($wmi_user -like '*WMI.USER*') -and ($wmi_pass -like '*WMI.PASS*'))) {
        # no
        $response = Invoke-Command -ComputerName $hostname -ScriptBlock $scriptBlock
    } else {
        # yes. convert user/password into a credential string
        $remote_pass = ConvertTo-SecureString -String $wmi_pass -AsPlainText -Force;
        $remote_credential = New-Object -typename System.Management.Automation.PSCredential -argumentlist $wmi_user, $remote_pass;
        $response = Invoke-Command -ComputerName $hostname -Credential $remote_credential -ScriptBlock $scriptBlock
    }
    exit 0
} catch {
    # exit code of non 0 will mean the script failed and not overwrite the instances that have already been found
    throw $Error[0].Exception
    exit 1
}
#endregion

#region REPLACE
try {
    $option        = New-PSSessionOption -NoMachineProfile

    #-----Determin the type of query to make-----
    if ($hostname -like $collectorName) {
        # check to see if this is monitoring the localhost collector,
        # as we will not need to authenticate.
        $session = new-pssession              `
            -SessionOption $option
    } elseif (
        ([string]::IsNullOrWhiteSpace($wmi_user)          `
        -and [string]::IsNullOrWhiteSpace($wmi_pass)) `
        -or (
            ($wmi_user -like '*WMI.USER*')           `
            -and ($wmi_pass -like '*WMI.PASS*')
        )
    ) {
        # are wmi user/pass set
        # -- e.g. are these device props either not substiuted or blank
        # no
        $session = new-pssession              `
            -computername  $hostname          `
            -SessionOption $option
    } else {
        # yes. convert user/password into a credential string
        $remote_pass       = ConvertTo-SecureString `
            -String        $wmi_pass `
            -AsPlainText `
            -Force;
        $remote_credential = New-Object `
            -typename      System.Management.Automation.PSCredential `
            -argumentlist  $wmi_user, $remote_pass;
        $session           = new-pssession              `
            -computername  $hostname          `
            -credential    $remote_credential `
            -SessionOption $option
    }

$response = Invoke-Command      `
    -session       $session     `
    -ScriptBlock   $scriptBlock        

    exit 0
} catch {
    # exit code of non 0 will mean the script failed and not overwrite the instances
    # that have already been found
    throw $Error[0].Exception
    exit 1
}
#endregion

p.s. the replacement code has the formatting I prefer.  Feel free to change it to suit your whitespace/line length needs.  Mine is a blend of every language I've ever used as I traditionally have been the only one looking at my code.  I call my formatting method the "I have to fix this 2 years from now and have a half an hour to figure it out" format.  generally, 1 specific function per line, sections that collapse into a single line to make it easier to work through the code.  The first character of each line should inform how it relates to the line above it.  spaces added to make neat functional columns of similar parts of the line (parameter name, variable).  Most programmers hate the formatting I use, but it works for me.  There are line continuation characters " `" to make it all fall into place.

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share