# encoding: ascii
# api: powershell
# title: Class Day 5
# description: Day 5 example includes SupportsShouldProcess
# version: 0.1
# type: function
# author: Don Jones
# license: CC0
# function: Get-ShareInfo
# x-poshcode-id: 5071
# x-archived: 2014-07-01T20:54:10
# x-published: 2014-04-11T13:27:00
#
#
function Get-ShareInfo {
<#
.SYNOPSIS
Gets share info. Name really says it all.
.DESCRIPTION
Not much more to offer. This uses CIM, so it needs Remoting enabled.
.PARAMETER ComputerName
The name of the computer(s) to query. Needs to be real names, not IP addresses.
.PARAMETER ErrorLogFile
Path and name of a text file where failed computer names will be logged. Might
be deleted each time you run the function.
.EXAMPLE
Get-ShareInfo -ComputerName ONE,TWO,THREE
.EXAMPLE
"one","two" | Get-ShareInfo
This example demostrates the use of pipeline input.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$True,HelpMessage='The computer name, duh',ValueFromPipeline=$True)]
[string[]]$ComputerName,
[Parameter(HelpMessage='A log file name')]
[string]$ErrorLogFile = 'c:\errors.txt'
)
BEGIN {
Remove-Item -Path $ErrorLogFile -force -ErrorAction SilentlyContinue
}
PROCESS {
foreach ($computer in $ComputerName) {
Write-Verbose "Connecting to $computer"
try {
$shares = Get-CimInstance -ErrorVariable x -ErrorAction Stop -ClassName Win32_Share -ComputerName $Computer -filter "Path<>''"
Write-Verbose "Got $($shares.count) shares"
Write-Verbose "Enumerate the shares on $computer"
foreach ($share in $shares) {
$sharename = $share.path -replace "\\","\\"
$directory = Get-CimInstance -EA Stop -ClassName Win32_Directory -Filter "Name='$($sharename)'"
Write-Debug "Finished getting info for $computer; building output object"
$properties = @{'ComputerName'=$Computer;
'Name'=$share.name;
'Path'=$share.path;
'Caption'=$share.caption;
'Readable'=$directory.readable;
'Writable'=$directory.writable}
$output = New-Object -TypeName PSObject -Property $properties
$output.psobject.typenames.insert(0,'ConTech.ShareInfo')
Write-Debug "Finished building output for $computer, ready to write"
Write-Output $output
} #foreach share
} catch {
$computer | out-file $ErrorLogFile -Append
Write-Warning "$computer - $x"
} #catch
} #foreach computer
} #PROCESS
} #function Get-ShareInfo
function Set-ServicePassword {
[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Medium')]
Param(
[Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[string[]]$ComputerName,
[Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$True)]
[string]$ServiceName,
[Parameter(Mandatory=$True,ValueFromPipelineByPropertyName=$True)]
[string]$NewPassword
)
PROCESS {
foreach ($computer in $computername) {
Write-Verbose "Changing $ServiceName password on $Computer"
if ($PSCmdlet.ShouldProcess("service '$servicename' on computer: $computer")) {
$ret = Get-CimInstance -ClassName Win32_Service `
-Filter "Name='$ServiceName'" `
-ComputerName $computer |
Invoke-CimMethod -MethodName Change `
-Arguments @{'StartPassword'=$NewPassword}
if ($ret.returnvalue -ne 0) {
Write-Warning "Error value $ret for $ServiceName on $Computer"
}
}
}
}
}