925 lines
32 KiB
PowerShell
925 lines
32 KiB
PowerShell
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
# Module removed due to #4272
|
|
# disabling tests
|
|
|
|
return
|
|
|
|
function RemoveTestGroups
|
|
{
|
|
param([string] $basename)
|
|
|
|
$results = Get-LocalGroup $basename*
|
|
foreach ($element in $results) {
|
|
Remove-LocalGroup -SID $element.SID
|
|
}
|
|
}
|
|
|
|
function VerifyFailingTest
|
|
{
|
|
param(
|
|
[scriptblock] $sb,
|
|
[string] $expectedFqeid
|
|
)
|
|
|
|
$backupEAP = $script:ErrorActionPreference
|
|
$script:ErrorActionPreference = "Stop"
|
|
|
|
try {
|
|
& $sb
|
|
throw "Expected FullyQualifiedErrorId: $expectedFqeid"
|
|
}
|
|
catch {
|
|
$_.FullyQualifiedErrorId | Should -Be $expectedFqeid
|
|
}
|
|
finally {
|
|
$script:ErrorActionPreference = $backupEAP
|
|
}
|
|
}
|
|
|
|
try {
|
|
#skip all tests on non-windows platform
|
|
$originalDefaultParameterValues = $PSDefaultParameterValues.Clone()
|
|
$IsNotSkipped = ($IsWindows -eq $true);
|
|
$PSDefaultParameterValues["it:skip"] = !$IsNotSkipped
|
|
|
|
Describe "Verify Expected LocalGroup Cmdlets are present" -Tags "CI" {
|
|
|
|
It "Test command presence" {
|
|
$result = Get-Command -Module Microsoft.PowerShell.LocalAccounts | ForEach-Object Name
|
|
|
|
$result -contains "New-LocalGroup" | Should -BeTrue
|
|
$result -contains "Set-LocalGroup" | Should -BeTrue
|
|
$result -contains "Get-LocalGroup" | Should -BeTrue
|
|
$result -contains "Rename-LocalGroup" | Should -BeTrue
|
|
$result -contains "Remove-LocalGroup" | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Describe "Validate simple New-LocalGroup" -Tags @('CI', 'RequireAdminOnWindows') {
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupAddRemove
|
|
}
|
|
}
|
|
|
|
It "Creates New-LocalGroup using only name" {
|
|
$result = New-LocalGroup -Name TestGroupAddRemove
|
|
|
|
$result.Name | Should -BeExactly TestGroupAddRemove
|
|
$result.ObjectClass | Should -Be Group
|
|
}
|
|
}
|
|
|
|
Describe "Validate New-LocalGroup cmdlet" -Tags @('Feature', 'RequireAdminOnWindows') {
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupAddRemove
|
|
}
|
|
}
|
|
|
|
It "Creates New-LocalGroup with name and description" {
|
|
$result = New-LocalGroup -Name TestGroupAddRemove -Description "Test Group New 1 Description"
|
|
|
|
$result.Name | Should -BeExactly TestGroupAddRemove
|
|
$result.Description | Should -BeExactly "Test Group New 1 Description"
|
|
$result.SID | Should -Not -BeNullOrEmpty
|
|
$result.ObjectClass | Should -Be Group
|
|
}
|
|
|
|
It "Errors on New-LocalGroup with name collision" {
|
|
$sb = {
|
|
New-LocalGroup TestGroupAddRemove
|
|
return New-LocalGroup TestGroupAddRemove
|
|
}
|
|
VerifyFailingTest $sb "GroupExists,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
|
|
It "Can use SID for group name" {
|
|
$sidName = "S-1-5-21-3949576937-491355012-4054854628-1053"
|
|
try {
|
|
$result = New-LocalGroup -Name $sidName
|
|
|
|
$result | Should -Not -BeNullOrEmpty
|
|
$result.Name | Should -BeExactly $sidName
|
|
$result.SID | Should -Not -BeExactly $sidName
|
|
$result.ObjectClass | Should -Be Group
|
|
}
|
|
finally {
|
|
RemoveTestGroups -basename $sidName
|
|
}
|
|
}
|
|
|
|
It "Errors on empty group name" {
|
|
$sb = { New-LocalGroup -Name "" }
|
|
VerifyFailingTest $sb "ParameterArgumentValidationError,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
|
|
It "Creates New-LocalGroup with name(256) at max" {
|
|
$nameMax = "A"*256
|
|
$desc = "D"*48
|
|
|
|
try {
|
|
$result = New-LocalGroup -Name $nameMax -Description $desc
|
|
|
|
$result.Name | Should -BeExactly $nameMax
|
|
$result.Description | Should -BeExactly $desc
|
|
$result.SID | Should -Not -BeNullOrEmpty
|
|
$result.ObjectClass | Should -Be Group
|
|
}
|
|
finally {
|
|
RemoveTestGroups -basename $nameMax
|
|
}
|
|
}
|
|
|
|
It "Errors on New-LocalGroup with name(256) over max" {
|
|
$name = "A"*257
|
|
$desc = "D"*129
|
|
|
|
try {
|
|
$shouldBeNull = New-LocalGroup -Name $name -Description $desc
|
|
throw "An error was expected"
|
|
}
|
|
catch {
|
|
$_.FullyQualifiedErrorId | Should -Be "ParameterArgumentValidationError,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
finally {
|
|
#clean up erroneous creation
|
|
if ($shouldBeNull) { Remove-LocalGroup -Name $name }
|
|
}
|
|
}
|
|
|
|
It "Creates New-LocalGroup with Description > 48 characters" {
|
|
$descMax = "Test Group Add Description that is longer than 48 characters"
|
|
$result = New-LocalGroup -Name TestGroupAddRemove -Description $descMax
|
|
|
|
$result.Description | Should -BeExactly $descMax
|
|
}
|
|
|
|
It "Errors on Invalid characters" {
|
|
#Arrange
|
|
#list of characters that should be invalid
|
|
$InvalidCharacters = @"
|
|
\/"[]:|<>+=;,?*
|
|
"@
|
|
$failedCharacters = @()
|
|
|
|
$InvalidCharacters = $InvalidCharacters[0..($InvalidCharacters.Length - 1)]
|
|
|
|
#Act
|
|
foreach ($character in $InvalidCharacters) {
|
|
try {
|
|
$invalidGroup = New-LocalGroup -Name ("InvalidBecauseOf" + $character) -ErrorAction Stop
|
|
}
|
|
catch {
|
|
}
|
|
finally {
|
|
if ($invalidGroup) {
|
|
Remove-LocalGroup -Name $invalidGroup
|
|
$failedCharacters += $character
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($failedCharacters.Count -gt 0) { Write-Host "characters causing test fail: $failedCharacters" }
|
|
$failedCharacters.Count -eq 0 | Should -BeTrue
|
|
}
|
|
|
|
It "Error on names containing only spaces" {
|
|
$sb = { New-LocalGroup -Name " " }
|
|
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
|
|
It "Error on names containing only periods" {
|
|
$sb = {
|
|
New-LocalGroup -Name "..."
|
|
}
|
|
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on names ending in a period" {
|
|
$sb = {
|
|
New-LocalGroup -Name "TestEndInPeriod."
|
|
}
|
|
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
|
|
$sb = {
|
|
New-LocalGroup -Name ".TestEndIn.Period.."
|
|
}
|
|
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Name over 256 characters" {
|
|
$sb = { New-LocalGroup -Name ("A"*257) }
|
|
|
|
try {
|
|
VerifyFailingTest $sb "ParameterArgumentValidationError,Microsoft.PowerShell.Commands.NewLocalGroupCommand"
|
|
}
|
|
finally {
|
|
RemoveTestGroups -basename ("A"*257)
|
|
}
|
|
}
|
|
}
|
|
|
|
Describe "Validate simple Get-LocalGroup" -Tags @('CI', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
New-LocalGroup -Name TestGroupGet1 -Description "Test Group Get 1 Description" | Out-Null
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupGet
|
|
}
|
|
}
|
|
|
|
It "Can Get-LocalGroup by specific group name" {
|
|
$result = Get-LocalGroup TestGroupGet1
|
|
|
|
$result.Name | Should -Be "TestGroupGet1"
|
|
$result.Description | Should -Be "Test Group Get 1 Description"
|
|
$result.ObjectClass | Should -Be "Group"
|
|
}
|
|
}
|
|
|
|
Describe "Validate Get-LocalGroup cmdlet" -Tags @('Feature', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
New-LocalGroup -Name TestGroupGet1 -Description "Test Group Get 1 Description" | Out-Null
|
|
New-LocalGroup -Name TestGroupGet2 -Description "Test Group Get 2 Description" | Out-Null
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupGet
|
|
}
|
|
}
|
|
|
|
#Note: this test is no longer in the test plan
|
|
It "Can Get-LocalGroup of all groups" {
|
|
$result = Get-LocalGroup
|
|
|
|
$result.Count -gt 2 | Should -BeTrue
|
|
}
|
|
|
|
It "Can Get-LocalGroup of a specific group by SID" {
|
|
$result = Get-LocalGroup TestGroupGet1
|
|
$resultBySID = Get-LocalGroup -SID $result.SID
|
|
|
|
$resultBySID.SID | Should -Not -BeNullOrEmpty
|
|
$resultBySID.Name | Should -Be TestGroupGet1
|
|
}
|
|
|
|
It "Can Get-LocalGroup of a well-known group by SID string" {
|
|
$sid = New-Object System.Security.Principal.SecurityIdentifier -ArgumentList BG
|
|
$guestGroup = Get-LocalGroup -SID BG
|
|
|
|
$guestGroup.SID | Should -Be $sid.Value
|
|
}
|
|
|
|
It "Can Get-LocalGroup by wildcard" {
|
|
$result = Get-LocalGroup TestGroupGet*
|
|
|
|
$result.Count -eq 2 | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet1" | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet2" | Should -BeTrue
|
|
}
|
|
|
|
It "Can Get-LocalGroup gets by array of names" {
|
|
$result = Get-LocalGroup @("TestGroupGet1", "TestGroupGet2")
|
|
|
|
$result.Count -eq 2 | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet1" | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet2" | Should -BeTrue
|
|
}
|
|
|
|
It "Can Get-LocalGroups by array of SIDs" {
|
|
$sid1 = (Get-LocalGroup TestGroupGet1).SID
|
|
$sid2 = (Get-LocalGroup TestGroupGet2).SID
|
|
$result = Get-LocalGroup -SID @($sid1, $sid2)
|
|
|
|
$result.Count -eq 2 | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet1" | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet2" | Should -BeTrue
|
|
}
|
|
|
|
It "Can Get-LocalGroups by pipe of an array of Group objects" {
|
|
$testGroups = Get-LocalGroup TestGroupGet*
|
|
$result = @($testGroups, $testGroups) | Get-LocalGroup
|
|
|
|
$result.Count -eq 4 | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet1" | Should -BeTrue
|
|
$result.Name -contains "TestGroupGet2" | Should -BeTrue
|
|
}
|
|
|
|
It "Can respond to -ErrorAction Stop" {
|
|
$result = $null
|
|
try {
|
|
Get-LocalGroup @("TestGroupGet1", "TestGroupGetNameThatDoesntExist1", "TestGroupGetNameThatDoesntExist2") -ErrorAction Stop -ErrorVariable outErr -OutVariable outOut | Out-Null
|
|
}
|
|
catch {
|
|
$result = @($outErr.Count, $outErr[0].ErrorRecord.CategoryInfo.Reason, $outOut.Name)
|
|
}
|
|
|
|
if ($null -eq $result)
|
|
{
|
|
# Force failing the test because an unexpected outcome occurred
|
|
$false | Should -BeTrue
|
|
}
|
|
else
|
|
{
|
|
$result[0] -eq 1 | Should -BeTrue
|
|
$result[1] -match "GroupNotFound" | Should -BeTrue
|
|
$result[2] -match "TestGroupGet1" | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
It "Errors on Get-LocalGroup by an invalid group name" {
|
|
$sb = {
|
|
Get-LocalGroup 'TestGroupGetNameThatDoesntExist'
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Get-LocalGroup by an invalid group SID" {
|
|
$sb = {
|
|
$result = New-LocalGroup -Name TestGroupGet3 -Description "Test Group Get 3 Description"
|
|
Remove-LocalGroup TestGroupGet3
|
|
Get-LocalGroup -SID $result.SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
}
|
|
|
|
It "Can get no local groups if none match wildcard" {
|
|
$localGroupName = 'TestGroupGetNameThatDoesntExist'
|
|
$result = (Get-LocalGroup $localGroupName*).Count
|
|
|
|
$result -eq 0 | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Describe "Validate simple Set-LocalGroup" -Tags @('CI', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = (New-LocalGroup -Name TestGroupSet1).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupSet
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
It "Can Set-LocalGroup by name" {
|
|
Set-LocalGroup -Name TestGroupSet1 -Description "Test Group Set 1 new description"
|
|
$result = Get-LocalGroup -Name TestGroupSet1
|
|
|
|
$result.Description | Should -BeExactly "Test Group Set 1 new description"
|
|
}
|
|
}
|
|
|
|
Describe "Validate Set-LocalGroup cmdlet" -Tags @('Feature', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = (New-LocalGroup -Name TestGroupSet1).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupSet
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
It "Can Set-LocalGroup by SID" {
|
|
Set-LocalGroup -SID $group1SID -Description "Test Group Set 1 newer description"
|
|
$result = Get-LocalGroup -Name TestGroupSet1
|
|
|
|
$result.Description | Should -BeExactly "Test Group Set 1 newer description"
|
|
}
|
|
|
|
It "Can Set-LocalGroup using -InputObject" {
|
|
$group = Get-LocalGroup TestGroupSet1
|
|
Set-LocalGroup -InputObject $group -Description "Test Group Set 1 newer still description"
|
|
$result = Get-LocalGroup TestGroupSet1
|
|
|
|
$result.Description | Should -BeExactly "Test Group Set 1 newer still description"
|
|
}
|
|
|
|
It "Can Set-LocalGroup using pipeline" {
|
|
Get-LocalGroup TestGroupSet1 | Set-LocalGroup -Description "Test Group Set 1 newer still description"
|
|
$result = Get-LocalGroup TestGroupSet1
|
|
|
|
$result.Description | Should -BeExactly "Test Group Set 1 newer still description"
|
|
}
|
|
|
|
It "Errors on Set-LocalGroup without specifying a Group" {
|
|
$sb = {
|
|
Set-LocalGroup -Description "Test Group Set 1 newer still description"
|
|
}
|
|
VerifyFailingTest $sb "AmbiguousParameterSet,Microsoft.PowerShell.Commands.SetLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Set-LocalGroup with an invalid Group name" {
|
|
$sb = {
|
|
Set-LocalGroup -Name "NonexistantGroupName" -Description "Test Group Set 1 newer still description"
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.SetLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Set-LocalGroup with an invalid Group SID" {
|
|
$sb = {
|
|
Set-LocalGroup -SID "S-1-5-21-1220945662-555555555-555555555-5555" -Description "Test Group Set 1 newer still description"
|
|
}
|
|
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.SetLocalGroupCommand"
|
|
}
|
|
|
|
It "Can Set-LocalGroup with description over 48 characters" {
|
|
$desc = "A"*129
|
|
Set-LocalGroup -Name TestGroupSet1 -Description $desc
|
|
$result = Get-LocalGroup -Name TestGroupSet1
|
|
|
|
$result.Description | Should -BeExactly $desc
|
|
}
|
|
}
|
|
|
|
Describe "Validate simple Rename-LocalGroup" -Tags @('CI', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
$group2SID = (New-LocalGroup -Name TestGroupRename2 -Description "Test Group Rename 2 Description" ).SID
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ( New-LocalGroup -Name TestGroupRename1 -Description "Test Group Rename 1 Description" ).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
Remove-LocalGroup -SID $group1SID
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupRename
|
|
}
|
|
}
|
|
|
|
It "Can Rename-LocalGroup using a valid group name" {
|
|
$group1SID | Should -Not -BeNullOrEmpty
|
|
Rename-LocalGroup TestGroupRename1 TestGroupRename1x
|
|
$result = Get-LocalGroup -SID $group1SID
|
|
|
|
$result.Name | Should -BeExactly TestGroupRename1x
|
|
}
|
|
}
|
|
|
|
Describe "Validate Rename-LocalGroup cmdlet" -Tags @('Feature', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
$group2SID = (New-LocalGroup -Name TestGroupRename2 -Description "Test Group Rename 2 Description" ).SID
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = (New-LocalGroup -Name TestGroupRename1 -Description "Test Group Rename 1 Description" ).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
Remove-LocalGroup -SID $group1SID
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupRename
|
|
}
|
|
}
|
|
|
|
It "Can Rename-LocalGroup using a valid group SID" {
|
|
$group1SID | Should -Not -BeNullOrEmpty
|
|
Rename-LocalGroup -SID $group1SID TestGroupRename1x
|
|
$result = Get-LocalGroup -SID $group1SID
|
|
|
|
$result.Name | Should -BeExactly TestGroupRename1x
|
|
}
|
|
|
|
It "Can Rename-LocalGroup using a valid group -InputObject" {
|
|
$group1SID | Should -Not -BeNullOrEmpty
|
|
$group = Get-LocalGroup TestGroupRename1
|
|
Rename-LocalGroup -InputObject $group -NewName TestGroupRename1x
|
|
$result = Get-LocalGroup -SID $group1SID
|
|
|
|
$result.Name | Should -BeExactly TestGroupRename1x
|
|
}
|
|
|
|
It "Can Rename-LocalGroup using a valid group sent using pipeline" {
|
|
$group1SID | Should -Not -BeNullOrEmpty
|
|
Get-LocalGroup TestGroupRename1 | Rename-LocalGroup -NewName TestGroupRename1x
|
|
$result = Get-LocalGroup -SID $group1SID
|
|
|
|
$result.Name | Should -BeExactly TestGroupRename1x
|
|
}
|
|
|
|
It "Errors on Rename-LocalGroup without specifying a Group" {
|
|
$sb = {
|
|
Rename-LocalGroup
|
|
}
|
|
VerifyFailingTest $sb "AmbiguousParameterSet,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors onRename-LocalGroup nonexistant group name" {
|
|
$sb = {
|
|
Rename-LocalGroup nonexistantGroupName -NewName DummyNewName
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors onRename-LocalGroup nonexistant group SID" {
|
|
$nonexistantSid =
|
|
$sb = {
|
|
Rename-LocalGroup -SID "S-1-5-21-1220945662-555555555-555555555-5555" -NewName DummyNewName
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Rename-LocalGroup Renames a valid group to already existing name" {
|
|
$newName = "TestGroupRename2"
|
|
|
|
$sb = {
|
|
Rename-LocalGroup TestGroupRename1 $newName
|
|
}
|
|
VerifyFailingTest $sb "NameInUse,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
|
|
$group1Name = (Get-LocalGroup -SID $group1SID).Name
|
|
$group2Name = (Get-LocalGroup -SID $group2SID).Name
|
|
|
|
$group1Name | Should -BeExactly TestGroupRename1
|
|
$group2Name | Should -BeExactly $newName
|
|
}
|
|
|
|
It "Errors on Invalid characters" {
|
|
#Arrange
|
|
#list of characters that should be invalid
|
|
$InvalidCharacters = @"
|
|
\/"[]:|<>+=;,?*
|
|
"@
|
|
$InvalidCharacters = $InvalidCharacters[0..($InvalidCharacters.Length - 1)]
|
|
$failedCharacters = @()
|
|
|
|
#Act
|
|
foreach ($character in $InvalidCharacters) {
|
|
try {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName ("InvalidBecauseOf" + $character) -ErrorAction Stop
|
|
$invalidGroup = (Get-LocalGroup ("InvalidBecauseOf" + $character))
|
|
}
|
|
catch {
|
|
}
|
|
finally {
|
|
#handle groups being erroneously renamed
|
|
if ($invalidGroup) {
|
|
Rename-LocalGroup -Name ("InvalidBecauseOf" + $character) -NewName TestGroupRename1
|
|
$failedCharacters += $character
|
|
}
|
|
}
|
|
}
|
|
|
|
#Assert
|
|
if ($failedCharacters.Count -gt 0) { Write-Host "characters causing test fail: $failedCharacters" }
|
|
$failedCharacters.Count -eq 0 | Should -BeTrue
|
|
}
|
|
|
|
It "Error on names containing only spaces" {
|
|
$sb = {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName " "
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Error on names containing only periods" {
|
|
$sb = {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName "..."
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on names ending in a period" {
|
|
$sb = {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName "TestEndInPeriod."
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
|
|
$sb = {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName ".TestEndIn.Period.."
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Errors on Rename-LocalGroup using a valid group but invalid -NewName" {
|
|
$sb = {
|
|
Rename-LocalGroup -Name TestGroupRename1 -NewName "TestGroupRename<>1x"
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
}
|
|
|
|
It "Can Rename-LocalGroup using a valid group name at max length 256" {
|
|
$newName = "A"*256
|
|
Rename-LocalGroup TestGroupRename1 $newName
|
|
$result = Get-LocalGroup -SID $group1SID
|
|
|
|
$result.Name | Should -BeExactly $newName
|
|
}
|
|
|
|
It "Errors on Rename-LocalGroup using a valid group name over max length 256" {
|
|
$newName = "A"*257
|
|
$sb = {
|
|
Rename-LocalGroup TestGroupRename1 $newName
|
|
}
|
|
VerifyFailingTest $sb "InvalidName,Microsoft.PowerShell.Commands.RenameLocalGroupCommand"
|
|
|
|
(Get-LocalGroup -SID $group1SID).Name | Should -BeExactly TestGroupRename1
|
|
}
|
|
}
|
|
|
|
Describe "Validate simple Remove-LocalGroup" -Tags @('CI', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = (New-LocalGroup -Name TestGroupRemove1 -Description "Test Group Remove 1 Description" ).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupRemove
|
|
$group1SID = ""
|
|
}
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by name" {
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
$removeResult = Remove-LocalGroup TestGroupRemove1 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
|
|
$sb = {
|
|
Get-LocalGroup -SID $group1SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount + 1 | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Describe "Validate Remove-LocalGroup cmdlet" -Tags @('Feature', 'RequireAdminOnWindows') {
|
|
|
|
BeforeAll {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = ""
|
|
$group2SID = ""
|
|
|
|
function VerifyBasicRemoval {
|
|
param (
|
|
[scriptblock]$removalAction
|
|
)
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
& $removalAction
|
|
|
|
$sb = {
|
|
Get-LocalGroup -SID $group1SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount + 1 | Should -BeTrue
|
|
}
|
|
|
|
function VerifyArrayRemoval {
|
|
param (
|
|
[scriptblock]$removalAction
|
|
)
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
& $removalAction
|
|
|
|
$sb = {
|
|
Get-LocalGroup -SID $group1SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
|
|
$sb = {
|
|
Get-LocalGroup -SID $group2SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount + 2 | Should -BeTrue
|
|
}
|
|
}
|
|
}
|
|
|
|
BeforeEach {
|
|
if ($IsNotSkipped) {
|
|
$group1SID = [String](New-LocalGroup -Name TestGroupRemove1 -Description "Test Group Remove 1 Description" 2>&1).SID
|
|
$group2SID = [String](New-LocalGroup -Name TestGroupRemove2 -Description "Test Group Remove 2 Description" 2>&1).SID
|
|
}
|
|
}
|
|
|
|
AfterEach {
|
|
if ($IsNotSkipped) {
|
|
RemoveTestGroups -basename TestGroupRemove
|
|
$group1SID = ""
|
|
$group2SID = ""
|
|
}
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by SID" {
|
|
$sb = {
|
|
$removeResult = Remove-LocalGroup -SID $group1SID 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyBasicRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup using -InputObject" {
|
|
$sb = {
|
|
$group = Get-LocalGroup TestGroupRemove1
|
|
$removeResult = Remove-LocalGroup -InputObject $group 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyBasicRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup using pipeline" {
|
|
$sb = {
|
|
$removeResult = Get-LocalGroup TestGroupRemove1 | Remove-LocalGroup 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyBasicRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by array of names" {
|
|
$sb = {
|
|
$removeResult = Remove-LocalGroup @("TestGroupRemove1","TestGroupRemove2") 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyArrayRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by array of SIDs" {
|
|
$sb = {
|
|
$removeResult = Remove-LocalGroup -SID @($group1SID, $group2SID) 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyArrayRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by array using -InputObject" {
|
|
$sb = {
|
|
$groups = Get-LocalGroup -Name @("TestGroupRemove1","TestGroupRemove2")
|
|
$removeResult = Remove-LocalGroup -InputObject $groups 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyArrayRemoval $sb
|
|
}
|
|
|
|
It "Can Remove-LocalGroup by array using pipeline" {
|
|
$sb = {
|
|
$removeResult = Get-LocalGroup -Name @("TestGroupRemove1","TestGroupRemove2") | Remove-LocalGroup 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
}
|
|
VerifyArrayRemoval $sb
|
|
}
|
|
|
|
It "Errors on Remove-LocalGroup without specifying a Name or SID" {
|
|
$sb = { Remove-LocalGroup }
|
|
VerifyFailingTest $sb "AmbiguousParameterSet,Microsoft.PowerShell.Commands.RemoveLocalGroupCommand"
|
|
}
|
|
|
|
It "Can Remove-LocalGroup with members" {
|
|
New-LocalUser TestUserRemove1 -NoPassword | Out-Null
|
|
Add-LocalGroupMember TestGroupRemove1 -Member TestUserRemove1 | Out-Null
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
$removeResult = Remove-LocalGroup TestGroupRemove1 2>&1
|
|
$removeResult | Should -BeNullOrEmpty
|
|
|
|
#clean-up
|
|
Remove-LocalUser TestUserRemove1 | Out-Null
|
|
|
|
$sb = {
|
|
Get-LocalGroup TestGroupRemove1
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount + 1 | Should -BeTrue
|
|
}
|
|
|
|
It "Errors on Remove-LocalGroup by invalid name" {
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
$sb = {
|
|
Remove-LocalGroup TestGroupRemove1NameThatDoesntExist
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.RemoveLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount | Should -BeTrue
|
|
}
|
|
|
|
It "Errors on Remove-LocalGroup by invalid SID" {
|
|
$initialCount = (Get-LocalGroup).Count
|
|
$initialCount -gt 1 | Should -BeTrue
|
|
|
|
$sb = {
|
|
Remove-LocalGroup -SID $group1SID
|
|
Remove-LocalGroup -SID $group1SID
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.RemoveLocalGroupCommand"
|
|
|
|
$finalCount = (Get-LocalGroup).Count
|
|
$initialCount -eq $finalCount + 1 | Should -BeTrue
|
|
}
|
|
|
|
It "Can respond to -ErrorAction Stop" {
|
|
$errCount = 0
|
|
$fqeid = ""
|
|
try {
|
|
Remove-LocalGroup @("TestGroupRemove1", "TestGroupRemoveNameThatDoesntExist1", "TestGroupRemoveNameThatDoesntExist2") -ErrorAction Stop -ErrorVariable outError
|
|
}
|
|
catch {
|
|
$errCount = $outError.Count
|
|
$fqeid = $_.FullyQualifiedErrorId
|
|
}
|
|
|
|
# Confirm that the expected errors were caught
|
|
$errCount | Should -Be 2
|
|
$fqeid | Should -Be "GroupNotFound,Microsoft.PowerShell.Commands.RemoveLocalGroupCommand"
|
|
|
|
# confirm that the first group was removed
|
|
$sb = {
|
|
Get-LocalGroup "TestGroupRemove1"
|
|
}
|
|
VerifyFailingTest $sb "GroupNotFound,Microsoft.PowerShell.Commands.GetLocalGroupCommand"
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
$global:PSDefaultParameterValues = $originalDefaultParameterValues
|
|
}
|
|
|