All posts by Thiyagu

Exporting and Importing bulk website bindings in IIS

While using multiple IIS servers in a Load Balanced Environment, it will be a lot of work to create all your website twice with the same settings on each webserver.  In this scenario, it will create more critical to create a large number of binding for each server, so there is possible to export and import your configuration from one webserver to the other by using the command.

Executed and Tested Version

OS : Windows 10
IIS : 10.0.15063.0

To Export the website/IIS Bindings:

Macking backup of IIS configuration is as simple as copying the directory into a backup directory, so you don’t need anything special to do it.  Just execute the below command in the Command prompt to make the backup copy in “C” drive with the file name Import_ProdBindings.xml

%windir%\system32\inetsrv\appcmd list site /config /xml > C:\Import_ProdBindings.xml

To Import the website/IIS Bindings:

As like Backup, it very simple to add the config to the IIS by using below command.

%windir%\system32\inetsrv\appcmd add site /in < C:\Import_ProdBindings.xml

OUTPUT:

Error :

I had faced the below error while exporting the config to the IIS. This error is due to the presence of “Default Web Site” in the targeted IIS.  So you can delete the existing one before executing the new config OR you can change the name of “Default Web Site” in the config and start the import from backup.

Pretty easy, eh?  Except for the dirty little secret everyone knows…remembering to do a backup before starting the Import! 

“ERROR ( message:Failed to add duplicate collection element “Default Web Site”. )”

Powershell : How to get Application and Systems Logs From Event Viewer

I would like to show how-to work with events under Applications and system Logs using Powershell. Whether it’s an error report, a warning, or just an informational log, one of the most common places for Windows to write logging information is to the event logs. Let we some of the reason to view the window’s log,

  • Checking for errors after an unexpected restart.
  • To check the reason for service stop.

The Get-Eventlog cmdlet is a powerful and flexible way of pulling data out of the event logs, both in interactive sessions and in scripts. The below code will execute and output the system and application error from the local computer

Example:

#Get log detail using Get-Eventlog cmdlet and here we filter by System Log.
#The -Newest 50 parameter, will get first 50 recent entries from a specific event log on the local computer.
$sysEvent = Get-Eventlog -Logname system -Newest 50 | where-object { $_.createddate -lt (get-date)}
# Filter only Error logs using EntryType parameter.
$sysError = $sysEvent | Where {$_.entryType -Match "Error"}
Write-Output "*******************************************************"
Write-Host "Event Log - System errors"
Write-Output "*******************************************************"
$sysError | Sort-Object EventID |
Format-Table EventID, Source, TimeWritten, Message -auto
#Filtering only by Application keyword for Application errors alone. 
$applicationEvent = Get-Eventlog -Logname application -Newest 50 | where-object { $_.createddate -lt (get-date)}
$applicationEvent = $applicationEvent | Where {$_.entryType -Match "Error"}
Write-Output "*******************************************************"
Write-Host "Event Log - Application errors"
Write-Output "*******************************************************"
$applicationEvent | Sort-Object EventID |
Format-Table EventID, Source, TimeWritten, Message -auto

OUTPUT:

Get-EventLog cmdlet :

Get-EventLog : Gets the events in an event log, or a list of the event logs, on the local or remote computers.

Syntax:

Get-EventLog [-LogName] <String> [-ComputerName <String[]>] [-Newest <Int32>] [-After <DateTime>]
             [-Before <DateTime>] [-UserName <String[]>] [[-InstanceId] <Int64[]>] [-Index <Int32[]>]
             [-EntryType <String[]>] [-Source <String[]>] [-Message <String>] [-AsBaseObject]
             [<CommonParameters>]

Execution on Remote Computers:

We don’t have credential parameter in the Get-EventLog. So Instead of the  Get-EventLog you may use the Get-WinEvent ,which support param the -Credential or use the  Get-WmiObject and class Win32_NTLogEvent

EX :

Get-EventLog -LogName "Windows PowerShell" -ComputerName "localhost", "TFS-Server1", "TFS-Server2"

 

 

Add Binding To IIS – PowerShell

Hi Guys, today we are going to disuses about how to add the binding to IIS using Powershell. In most case, during the deployments, the one of the painful activity is adding binding for new sites. So this below posts will help those members to one step towards of Automation.

The New-WebBinding cmdlet adds a new binding to an existing website.

#Assigining the URL which need to bind
$_WebsiteUrl = "www.dotnet-helpers.com"
#Name of the WEB SITE name created under Sites Folder(IIS)
$_TargetIISWebsite ="Default Web site"
#It has a method IsNullOrEmpty() which returns true if the passed string is null or empty.
if([string]::IsNullOrWhiteSpace($_TargetIISWebsite))
{     
  write-host "website not created." 
}   
else    
{       
  #TRIM: Removes all leading and trailing white-space characters from the current String object
  $WebsiteUrl = $_WebsiteUrl.Trim(' ')
}
foreach ($Website in $_WebsiteUrl)
{
  #We are adding the SSL binding to the Default Web Site using New-WebBinding cmdlets
  New-WebBinding -Name $web -IPAddress "*" -Port 80 -protocol http -HostHeader $Website -sslflags
  New-WebBinding -Name $web -IPAddress "*" -Port 443 -protocol https -HostHeader $Website -sslflags  
  write-host $Website "Binding created successfully on" $_TargetIISWebsite   
}
}

Explanation:

The New-WebBinding cmdlet adds a new binding to an existing website.

New-WebBinding -Name $web -IPAddress “*” -Port 80 -protocol http -HostHeader $Website -sslflags 0

-NameThe name of the Web site on which the new binding is created.
-IPAddressThe IP address of the new binding.
-PortThe port used for the binding.
-ProtocolThe protocol to be used for the Web binding (usually HTTP, HTTPS, or FTP).
-HostHeaderThe host header of the new binding.
-SslFlagsIndicates what type of certificate OR certificate storage the new website supports. Only the below values are valid:

0 (Regular certificate in Windows certificate storage),
1 (SNI certificate),
2 (central certificate store),
3 (SNI certificate in central certificate store).

 

 

What do you think?

I hope you have idea of how to add the binding to IIS using Powershell Script. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.

Import-Module : The specified module ‘ServerManager’ was not loaded because no valid module file was found in any module directory

Error: Import-Module : The specified module ‘ServerManager’ was not loaded because no valid module file was found in any module directory.

While importing a module you may receive an error message :

Import-Module : The specified module 'ServerManager' was not loaded because no valid module file was found in any module directory.
At line:1 char:1
+ Import-Module ServerManager
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (ServerManager:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

Reason and Resoultion

This error happens when you are using a 64 bit version of powershell/powershell ISE, and trying to import a 32 bit module or you are using a 32 bit version of powershell/Powershell ISE, and trying to import a 64 bit module.

Note: This type of error is possible on multiple modules, not only servermanager .

 

What do you think?

I hope you have idea of how to resolve “The specified module ‘ServerManager’ was not loaded because no valid module file was found in any module directory. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.

Powershell Script for Website Availability Monitoring with Excel Report as output

In our previous post we already discussed about “How to check response code from a website using PowerShell by using single URL in example. Here let we discuss how to read the list of URLs from the text file and validate the list of URL . Finally script will generate the Excel file with the output result.

$URLListFile = "D:\PowerShell\URLList.txt"
#Reading the list of URLs from the URLList.txt file 
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue
#Declaring Array
$Result = @()
$FormatGenerater = "<HTML><BODY background-color:grey><font color =""black""><H2> snfcms cert </H2>
</font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B>
</TD><TD><B>StatusCode</B></TD></TR>"
   
Foreach($URL in $URLList) 
{ 
  $time = try{ 
      $request = $null 
      #Measure-Command : Measures the time it takes to run script blocks and cmdlets.
      $response = Measure-Command { $request = Invoke-WebRequest -Uri $URL } 
      $response.TotalMilliseconds 
  }  
  catch 
  { 
   $request = $_.Exception.Response 
   $time = -1 
  }   
  $result += [PSCustomObject] @{ 
  Time = Get-Date; 
  Uri = $URL; 
  StatusCode = [int] $request.StatusCode; 
  } 
} 
if($result -ne $null) 
{  
    Foreach($Entry in $Result) 
    { 
        if($Entry.StatusCode -ne "200") 
        { 
            $FormatGenerater += "<TR bgcolor=grey>" 
        } 
        else 
        { 
            $FormatGenerater += "<TR bgcolor=lightgreen>" 
        } 
        $FormatGenerater += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD></TR>" 
    } 
    $FormatGenerater += "</Table></BODY></HTML>" 
}  
$FormatGenerater | out-file D:\PowerShell\SiteValidation_Results.xls

OUTPUT Excel File:

 

What do you think?

I hope you have idea of how to check the Website Availability Monitoring with Excel Report as output. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.

How to get the array as input using Powershell

To read an array into Read-Host (get the array as input), you would need to put it in a loop because anything entered into Read-Host will be interpreted as a string. To make output in new line we can use $OFS, which is a special variable in PowerShell . OFS stands for Output field separator . You would use this to separate object/Array.

The .split() method is self explanatory, the .trim() method will simply remove leading and trailing spaces and leading and trailing line breaks

Example #1 : Getting Value as an Array by Looping

$arrayInput = @()
do {
$input = (Read-Host "Please enter the Array Value")
if ($input -ne '') {$arrayInput += $input}
}
#Loop will stop when user enter 'END' as input
until ($input -eq 'end')
$arrayInput

OUTPUT:

Example 2# : Alternative approach for handling the multiple inputs without loop.

#Set New line using OFS special Powershell variable
$OFS = "`n"
#Externally set input value as string
[string[]] $_ServerList= @()
#Get the input from the user
$_ServerList = READ-HOST "Enter List of Servers"
#splitting the list of input as array by Comma & Empty Space
$_ServerList = $_ServerList.Split(',').Split(' ')
$OFS + $_ServerList

Output:

How to move files from one location to another location using PowerShell

In this article, Let me show you how to move files from one location to another location using PowerShell script. The Move-Item cmdlet moves an item, including its properties, contents, and child items, from one location to another location. The locations must be supported by the same provider.

Move-Item : Cannot create a file when that file already exists.

Example:1 Moving single files/folders

In the PowerShell window, type the command below and press ENTER. After the –path parameter, type the path of the file on your local PC that you want to copy, and after the –destination parameter, type the path of the destination folder. In the example below, I’m moving a file called URL_List.txt from the Source File Path folder to the Destination File Path folder.

$_SourcePath = "D:\BLOG\Power Shell\Examples\Source File Path\URL_List.txt"
$_DestinationPath = "D:\BLOG\Power Shell\Examples\Destination File Path"
Move-item –path $_SourcePath –destination $_DestinationPath

OR we can directly mention the path of files location without -path Keyword

Move-item $_SourcePath $_DestinationPath

Example:2 Moving all the item which created today.

From below code, we getting all files and folder which created today and move from “Source File Path” folder to “Destination File Path” folder.

get-childitem -Path "D:\BLOG\Power Shell\Examples\Source File Path" -Recurse |
Where-Object {$_.CreationTime -gt (Get-date).Date} |
move-item -destination "D:\BLOG\Power Shell\Examples\Destination File Path"

Also, by default, Get-ChildItem does not move hidden files. To move hidden files, use the Force parameter with Get-ChildItem.

Example:3 Moving the files based on File Type (extension)

I had created $_FileType array which contains the list of file types that need to move. After execution, all .html and .txt files will move from source to destination folder. Please refer to the snapshots to under stand the before and after the script execution

#location of starting directory
$_sourcePath ="C:\Users\dotnet-helpers\Desktop\SourcePath"
#location where files will be copied to 
$_destinationPath = "C:\Users\dotnet-helpers\Desktop\DestinationPath";
#Array of extension that need to move from source path
$_FileType= @("*html*", "*.*txt")
Get-ChildItem -recurse ($_sourcePath) -include ($_FileType) | move-Item -Destination ($_destinationPath)

OUTPUT:

Before Execution: Source Folder/Destination Folder

After Execution: Source Folder/Destination Folder

 

What do you think?

I hope you have an idea of how to move the files from one location to another location using the Powershell script. I would like to have feedback from the readers of my posts. Your valuable feedback, question, or comments about this article are always welcome.

 

KnockoutJS – Visible Binding

As the name specifies this binding makes the related DOM element to be visible or hidden based on the value passed in the binding.

Syntax

visible: <binding-condition>

Parameters

When the parameter transforms into false (like false/0/null/undefined), then the binding sets display:none for the element to making it as hidden.

When the parameter transforms into true (true/non-null/array ), the binding removes the element’s display value and makes it visible.

Example

<html>
<head>
<title>KnockoutJS Computed Observables</title>
<script src="https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.4.2.js"></script>
</head>
<body>
<a href="#" data-bind="click: toggleVisibility">Show/Hide Text</a>
<br/><br />
<div data-bind="visible: shouldShowMessage">
Welcome To Dotnet-helpers.com Learning Curve
</div>
<script type="text/javascript">
var viewModel = function () {
this.shouldShowMessage = ko.observable(true);
this.toggleVisibility = function () {
this.shouldShowMessage(!this.shouldShowMessage());
alert('shouldShowMessage status ' + this.shouldShowMessage());
};
};
ko.applyBindings(new viewModel());
</script>
</body>
</html>

OUTPUT

 

What do you think?

I hope you have idea of how to use KnockoutJS visible or hidden based on the value passed in the binding. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.

KnockoutJS – Controlling text and appearance

The “text” binding

The text binding causes the associated DOM element to display the text value of our parameter. This is used in text-level DOM elements such as div,span. The text binding accepts any data type and parses it into String before rendering it.

Syntax:

text: <binding-value>

Parameters

  • Knockout sets the element’s content to a text node with your parameter value. And if there is any previous content then it will be overwritten.
  • If this parameter is an observable value, then the binding value will update the element’s text whenever the value changes.  If the parameter isn’t observable then it will only set the element’s text once and will not update again.

Example

<html>
<head>
<title>KnockoutJS Computed Observables</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
</head>
<body>
<span data-bind="text: myMessage1"></span><br /><br />
<span data-bind="text: myMessage"></span>
<script type="text/javascript">
var MyModel = {
myMessage: ko.observable("myMessage: IntialMessage"),
myMessage1: ko.observable("IntialMessage - Welcome to dotnet-helpers.com")
};
MyModel.myMessage("myMessage1 : Welcome to KO Learning curve session");
ko.applyBindings(MyModel);
</script>
</body>

OUTPUT

 

What do you think?

I hope you have idea of Controlling text and appearance. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.

 

How to check response code from a website using PowerShell

In this post we will discuss about how to check the response code from a website. In this article, we’re going to cover how to build a PowerShell function that will query a specific URL and attempt to find out if that URL is working fine or not. To get started, let’s construct a function for this task called CheckSiteURLStatus with a single parameter called URL.

Net.WebReques makes a request to a Uniform Resource Identifier (URI). This is an abstract class.

Using Net.WebRequest class (which is under the System.Net namespace), we get a response from a web server. Unlike the Net.WebClient class, you will not be able to download the site page. However, using Net.WebRequest class, you can get a response code and also see what type of web server is being used to host the site. The WebRequest class has a static method called Create in which we can pass a URL to invoke a HTTP,  We’ll add the code to create the request into our function as shown below.

[string] $_URL = 'https://dotnet-helpers.com'
function CheckSiteURLStatus($_URL) {
try {
$request= [System.Net.WebRequest]::Create($_URL)
$response = $request.getResponse()
if ($response.StatusCode -eq "200") {
write-host "`nSite - $_URL is up (Return code: $($response.StatusCode) - 
$([int] $response.StatusCode)) `n" -ForegroundColor green 
}
else {
write-host "`n Site - $_URL is down `n" ` -ForegroundColor red
}
} catch {
write-host "`n Site is not accessable, May DNS issue. Try again.`n" ` -ForegroundColor red
}
}
CheckSiteURLStatus $_URL

Based on the response code, the condition will execute and write on the console.Finally, we’ll need to dispose of the response after we’re done to clear it from memory which would finish it off to make it look like this:

OUTPUT

What do you think?

I hope you have idea of how to check the Website status using Powershell script. I would like to have feedback from my posts readers. Your valuable feedback, question, or comments about this article are always welcome.