user2668483
user2668483

Reputation: 13

Powershell remote application(.cmd) deployment

I am beginner with PowerShell and struggling to get this around with the help from different sites, My requirement and scenario is

I have a windows server 2008(rktdepy) with PowerShell installed and I have packaged application with a .cmd file. When I click this .cmd file the application will be deployed.

The server name is rktdepy and I want to create a PowerShell script which will connect to other servers in the network (the server names should be picked up from a txt files) and install the application accessing the file remotely from rktdepy server. The files are not supposed to be copied to any server and should not use psxec for security reason.

So far I have used invoke and mapping the network drive but still I have issues

$Comsession = Get-content c:\adminfiles\scripts\deploy.txt | new-pssession -throttlelimit 50
Invoke-command -computername RKTDEPLY54 -scriptblock { (new-object -comobject wscript.network).mapnetworkdrive("R:", "\\rktdepy\deploy", $true) }
Invoke-command -session $comsession -scriptblock {"CMD /C r:\QR_DEPLOY.CMD"}

The above script throws error,

I dont want to use any password in the script and it should fetch the current logged in user password from rktdepy server. I is ok if the scripts prompts for a user name and password which will have admin access to all servers.

Upvotes: 0

Views: 533

Answers (2)

Mitul
Mitul

Reputation: 9854

I have testing the following on my machine and it is working so far. There is also another method you can try out listed below.

Method1:
1. I have txt file with a list of computers named allcomputers.txt. It contains name of machines on each line.

Machine10  
Machine20  
Machine30  
Machine40  
  1. The deployment script (mydeploytest.ps1) which accepts Computername, Username and Password as input and creates a new PSSession and then invokes command.

    param(
    [string]$ComputerName,
    [string]$User,
    [string]$pass
    )
    Get-PSSEssion | Remove-PSSession
    $session = New-PSSession -ComputerName $ComputerName
    Invoke-Command -Session $session -ScriptBlock {
    param(
    [string]$ComputerName,
    [string]$Username,
    [string]$Password
    )
    $net = new-object -ComObject WScript.Network
    $net.MapNetworkDrive("U:", "\\RKTDEPY\deploy", $false, $Username, $Password)
    Invoke-Expression "CMD /C U:\deploy.cmd"
    $net.RemoveNetworkDrive("U:")
    } -args $ComputerName,$User,$pass
    Get-PSSEssion | Remove-PSSession

  2. Powershell commandline oneline to accomplish deployment task.

PS C:> Get-Content C:\scripts\allcomputers.txt | Foreach { C:\scripts\mydeploytest.ps1 $_ "yourserviceaccount" "password"}

Method2:
The help method for Invoke-Command has an example on how to solve the doublehop issue stevals is mentioning in the answer.

PS C:\> Enable-WSManCredSSP -Delegate Server02
 PS C:\>Connect-WSMan Server02
 PS C:\>Set-Item WSMan:\Server02*\Service\Auth\CredSSP -Value $true
 PS C:\>$s = New-PSSession Server02
 PS C:\>Invoke-Command -Session $s -ScriptBlock {Get-Item \\Net03\Scripts\LogFiles.ps1} -Authentication CredSSP
 -Credential Domain01\Admin01

I think with little modification to method 2 you can achieve what you want.

Upvotes: 0

stevlars
stevlars

Reputation: 96

It looks like you are dealing with a couple problems. One is that the session where you map the drive is gone when you run the next Invoke-Command that uses the mapped drive. You could move that into the same script block to fix a problem like that. The second one is a "second hop" issue. See a resource like Don Jones' Secrets of PowerShell Remoting free ebook on http://powershell.org/wp/books. Steve

Upvotes: 1

Related Questions