“Did you mean windows powers hell ?” is message you get when you search for “Windows PowerShell” in download.microsoft.com. Isn’t this funny? One of my friends noticed this. I feel MS should look at their search algorithm and make PowerShell as known word and don’t recommend “Powers hell”.
If any MVPs or Microsoft Persons happens to look at this post, please inform respective team in Microsoft to get this corrected. After all it is the first thing any one would do if they want to learn powershell.
Here is the screenshot of it.

We want to assign output of a cmdlet/function to a variable so that we can use it in further processing. In scripts it is very inconvenient to debug a issue if the output is going to a variable and not to console. In such cases we can do nothing other than printing the variable value to the console by inserting extra lines of code.
To avoid such inconvenience, powershell has got a way to assign the output to a variable and print to console at the same time. This helped me in quick debugging of my scripts and oneliners.
Ok. Enough explaining about the usage and all and here is how it works.
($service = Get-Service -Name spooler)
Execute the command and you will understand what exactly it is doing. All we need to do it embed the whole command into into brackets like shown above.
Hope this little one helps you. Happy learning.
This powershell function helps you to get the network status of all network adapters in a given computer. Using this script it is easy to determine the status of all network connections in remote computer to see whether it is connected/disconnected/media disconnected/and different other statuses. This script queries Win32_NetworkAdapter WMI class for list of network adapters and then fetches the status of each adapter by querying “netconnectionstatus” parameter. This is a uint16 data type which returns any value ranging from 0-12. Each value from 0 to 12 has it’s own meaning. See the below table for details(source: MSDN)
| Value |
Meaning |
- 0 (0×0)
|
Disconnected |
- 1 (0×1)
|
Connecting |
- 2 (0×2)
|
Connected |
- 3 (0×3)
|
Disconnecting |
- 4 (0×4)
|
Hardware not present |
- 5 (0×5)
|
Hardware disabled |
- 6 (0×6)
|
Hardware malfunction |
- 7 (0×7)
|
Media disconnected |
- 8 (0×8)
|
Authenticating |
- 9 (0×9)
|
Authentication succeeded |
- 10 (0xA)
|
Authentication failed |
- 11 (0xB)
|
Invalid address |
- 12 (0xC)
|
Credentials required |
So, here is the script which lists the network adapter name and its status.
Script:
function Get-NetworkConnectionStatus {
param(
$ComputerName=$env:computername
)
$statushash = @{
0 = "Disconnected"
1 = "Connecting"
2 = "Connected"
3 = "Disconnecting"
4 = "Hardware not present"
5 = "Hardware disabled"
6 = "Hardware malfunction"
7 = "Media Disconnected"
8 = "Authenticating"
9 = "Authentication Succeeded"
10 = "Authentication Failed"
11 = "Invalid Address"
12 = "Credentials Required"
}
$networks = Gwmi -Class Win32_NetworkAdapter -ComputerName $computername
$networkName = @{name="NetworkName";Expression={$_.Name}}
$networkStatus = @{name="Networkstatus";Expression=`
{$statushash[[int32]$($_.NetConnectionStatus)]}}
foreach ($network in $networks) {
$network | select $networkName, $Networkstatus
}
}
Usage:
Get-NetworkConnectionStatus -ComputerName PC1
Hope this helps…
In this post, I will show you how to pragmatically query battery status in laptops using powershell. It is important to check batter status before performing some critical tasks like patch updates or service pack updates via some automation(s). If the laptop charging drains down in middle of the upgrade, it can corrupt the operating system.
You can use below one liner to check the percentage of charging left in the battery:
(Get-WmiObject -Class Win32_Battery).estimatedchargeremaining
Similarly, if you want to how many more minutes this charging comes, you can use below code:
(Get-WmiObject -Class Win32_Battery).EstimatedRunTime
Hope this helps and you will have crash free upgrades on laptops.
I wrote on the similar topic before. My earlier attempt was to determine OS architecture but this time, I am going to talk about querying CPU architecture using powershell code. It is needless to explain the difference between these two things.
So, below is the code which helps you determine CPU architecture of a computer.
function Get-CPUArchitecture {
if (($ENV:Processor_Architecture -eq "x86" -and (test-path env:PROCESSOR_ARCHITEW6432)) -or ($ENV:Processor_Architecture -eq "AMD64")) {
write-host "Detected 64-bit CPU architecture"
} elseif ($ENV:Processor_Architecture -eq 'x86') {
write-host "Detected 32-bit CPU architecture"
} else {
write-host "Unable to determine CPU architecture"
}
}

Hope this helps…
This small powershell command helps you to get the domain controller name currently in use.
PS C:> ([ADSI]“LDAP://RootDSE”).dnshostname
DC1.Techibee.com
PS C:>
You can also know to which site this DC belongs to.
PS C:> ([ADSI]“LDAP://RootDSE”).servername.tostring().split(“,”)[2].Split(“=”)[
1]
SITE1
PS C:>
Isn’t it looking a bit complex to query the site name? Any alternatives? Yes, we do have one. Below helps you to query the Site name of DC you connected.
import-module ActiveDirectory
Get-ADDomainController -Discover | select Site
Site
—–
SITE1
Note that above command requries ActiveDirectory PowerShell module which is generally available in Windows 7. One more requirement to make ActiveDirectory Module work agaist your Active Directory is, your DCs should have ADWS(active directory web services) installed. These services comes by default with windows 2008 servers but on windows 2003 servers you need to install this additional components.
Refer to my old article about Active Directory Administrative Center where I talked about ADWS for windows 2003.
One other nice thing I found with PowerShell is it’s ability of using APIs by importing DLLs. Below is one example, where user32.dll is imported and LockWorkstation Function is invoked to lock the desktop. Btw, I grabbed this script from TechNet Library
Function Lock-WorkStation {
$signature = @”
[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
“@
$LockWorkStation = Add-Type -memberDefinition $signature -name “Win32LockWorkStation” -namespace Win32Functions -passthru
$LockWorkStation::LockWorkStation() | Out-Null
}
After executing above code, invoking “Lock-WorkStation” command from PowerShell window will lock your PC.
Happy Learning..,
Sitaram Pamarthi
Today I want to turn my some of the scripting efforts to public.
Sometimes I get requirements to see how many machines are online which are part of a AD security group. I worst method I used to follow was dumping the group member list to some text file and making use of a batch script to ping the machine and check the status. This is pretty good but consuming some of my time for dumping and analyzing. So why below script is born….
You just need to give the group DN in the script and execute it with cscript. That shows the machine status if it is online or not. Feel free to modify the script to match your requirements and let me know if I can be of any help.
‘##########################################################################
‘# Purpose : To check the ping status of computers part of a security group
‘# Author : Sitaram Pamarthi
‘#
‘##########################################################################
‘On Error Resume Next
‘ Replace with your group DN
GroupDN=”ldap://CN=Your/ Group Name,OU=Your OU name,DC=domain,DC=com”
Set objGroup = GetObject(GroupDN)
objGroup.GetInfo
arrMemberOf = objGroup.GetEx(“member”)
For Each strMember in arrMemberOf
Set objGroup1 = GetObject(“LDAP://” & strMember)
strHost=trim(objGroup1.dNSHostName)
set objPing = GetObject(“winmgmts:{impersonationLevel=impersonate}”).ExecQuery _
(“select * from Win32_PingStatus where address = ‘” & strHost & “‘”)
for each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 then
WScript.Echo strhost & “ ==> host not reachable”
else
Ping = True
wscript.echo strhost & ” ==> Machine Reachable”
end if
next
Next
‘#End of script.
Happy Learning…,
Sitaram Pamarthi
I know there are varioud menthods for finding the hotfix installation status, but I felt this as very easy one.
To find the hotfix installation status on local machine:
wmic qfe where hotfixid=”KB958644″ list full
To find on a remote machine:
wmic /node: qfe where hotfixid=”KB958644″ list full
To find on list of machines:
o Place all machines into a text file(machine.txt)
o Run the below batch file
=== File name: get-hotfix-status.bat ===
echo off
for /f “tokens=* delims= ” %a in (test.txt) do wmic/Node:%a qfe where hotfixid=”KB958644″ list full
=== End of file ===
Please comment if you know any better way.
Happy Learning,
Sitaram Pamarthi,