Monthly Archive

Categories

Monthly Archives: June 2016

Converting strings to dates

You’ll see many examples of this:

PS>  [datetime]'12/25/2016'

25 December 2016 00:00:00

 

This works great if the date is in US format – MM/DD/YYYY

 

For those of us who use different date formats – such as England DD/MM/YYYY – this approach won’t work

PS>  [datetime]'25/12/2016'
Cannot convert value "25/12/2016" to type "System.DateTime". Error: "String was not recognized as a
valid DateTime."
At line:1 char:1
+ [datetime]'25/12/2016'
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider

 

You need to rearrange the string  -  for example

$ds = '25/12/2016' -split '/'

PS>  [datetime]("{0}/{1}/{2}" -f $ds[1], $ds[0], $ds[2])

25 December 2016 00:00:00

 

PS>  Get-Date -Day $ds[0] -Month $ds[1] -Year $ds[2]

25 December 2016 10:44:45

 

or even simpler

PS>  Get-Date -Date '25/12/2016'

25 December 2016 00:00:00

 

Not sure when the last option came in. Its in PowerShell v5

32 or 64 and/or Administrator

When you run the PowerShell console (or ISE) the default icon runs a 32 or 64 bit version that matches your OS. On a 64 bit machine you have the option of running in 32bit (icons have a (x86) suffix on the title.

 

How can you tell whether you’re running in 32 or 64 bit mode?

 

One way is shown in this forum question - http://powershell.org/forums/topic/requires/#post-42226

 

I prefer the simpler:

if ([System.IntPtr]::Size -eq 8) {$size = '64 bit'}
else {$size = '32 bit'}

 

I don’t like automatically kicking into the required bit version if its wrong. I prefer to abort the processing with a message to run as 32 or 64 bit as appropriate

 

You can perform a similar test for administrator privileges (running elevated)

$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$secprin = New-Object Security.Principal.WindowsPrincipal $currentUser
if ($secprin.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator))
{$admin = 'Administrator'}
else {$admin = 'non-Administrator'}

 

Though on later versions of Powershell its easier to use

#requires –RunAsAdministrator

Local Administrators

Finding the local administrators on a system is a not infrequent action.  There are a number of ways to do this.

 

The oldest method is to use the ADSI WinNT provider

$group =[ADSI]"WinNT://$($env:COMPUTERNAME)/Administrators, group"
$members = @($group.psbase.Invoke("Members"))
$members | Foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

 

NOTE – this doesn’t work on my Windows 10 system – build 14352

I’d recommend avoiding the WinNT provider if you can

 

WMI provides this option

$group = Get-CimInstance -ClassName Win32_Group -Filter "Name='Administrators'"
Get-CimAssociatedInstance -InputObject $group -ResultClassName Win32_UserAccount

 

You can also use a .NET based approach with the System.DirectoryServices.AccountManagement  namespace

using assembly System.DirectoryServices.AccountManagement
$ctype = [System.DirectoryServices.AccountManagement.ContextType]::Machine
$context = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ctype, $($env:COMPUTERNAME)

$idtype = [System.DirectoryServices.AccountManagement.IdentityType]::Name
$grp = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context, $idtype, "Administrators")
$grp.Members | select SamAccountName

 

This is a bit more complicated as you have to load the assembly (using is new to PowerShell v5 – use Add-Type in earlier versions)

Set the context to the local machine and the identity type to Name

You can then use FindByIdentity() to get the local adminsitrators groups and look at the Members property to find the group members.

 

PowerShell v5 brings a Local Accounts module - Microsoft.PowerShell.LocalAccounts

Add-LocalGroupMember
Disable-LocalUser
Enable-LocalUser
Get-LocalGroup
Get-LocalGroupMember
Get-LocalUser
New-LocalGroup
New-LocalUser
Remove-LocalGroup
Remove-LocalGroupMember
Remove-LocalUser
Rename-LocalGroup
Rename-LocalUser
Set-LocalGroup
Set-LocalUser

 

NOTE – depending on your version of PowerShell v5 you may, or may not have this module. Its present in the later Windows 10 builds (on Insider Preview) and in Windows server 2016 TP 5. Eventually it’ll become available on all Windows 10 systems through Windows updates.

 

PS>  Get-LocalGroupMember -Group Administrators | select Name

Name
----
RSsurfacePro2\Administrator
RSSURFACEPRO2\Richard

PowerShell Summit 2017–request for topics

The PowerShell Summit is a community event. PowerShell.orh may organise it but we’re very aware that it is the PowerShell community’s event.

 

We’ve been planning the  2017 Summit for a while and we’ve reached a point in the process where we need your help.

 

What topics would you like to see covered at the 2017 Summit. We’ve published a request for topics at -http://powershell.org/request-for-topics/

 

Please let us know the topic areas you’d like covered and we can build that information into our agenda planning to ensure we have the Summit the community wants

Dates in file and folder names

If you want to incorporate the date in a file or folder name you can’t use Get-Date directly

PS>  Get-Date

01 June 2016 20:52:03

 

The simplest answer is to use the –Format or –Uformat parameters:

PS>  Get-Date -Format yyyyMMdd
20160601

PS>  Get-Date -UFormat %Y%m%d
20160601