mirror of
https://github.com/PowerShell/PSDscResources
synced 2026-06-21 13:45:29 +00:00
adding User resource
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
[ClassVersion("1.0.0"), FriendlyName("User")]
|
||||
class MSFT_UserResource : OMI_BaseResource
|
||||
{
|
||||
[Key,Description("The name of the User to Create/Modify/Delete")] String UserName;
|
||||
[Write,Description("An enumerated value that describes if the user is expected to exist on the machine"),ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure;
|
||||
[Write,Description("The display name of the user")] String FullName;
|
||||
[Write,Description("A description for the user")] String Description;
|
||||
[Write,Description("The password for the user"),EmbeddedInstance("MSFT_Credential")] String Password;
|
||||
[Write,Description("Value used to disable/enable a user account")] Boolean Disabled;
|
||||
[Write,Description("Value used to set whether a user's password expires or not")] Boolean PasswordNeverExpires;
|
||||
[Write,Description("Value used to require a user to change their password")] Boolean PasswordChangeRequired;
|
||||
[Write,Description("Value used to set whether a user can/cannot change their password")] Boolean PasswordChangeNotAllowed;
|
||||
};
|
||||
Binary file not shown.
@@ -0,0 +1,23 @@
|
||||
# Localized resources for User
|
||||
|
||||
ConvertFrom-StringData @'
|
||||
UserWithName = User: {0}
|
||||
RemoveOperation = Remove
|
||||
AddOperation = Add
|
||||
SetOperation = Set
|
||||
ConfigurationStarted = Configuration of user {0} started.
|
||||
ConfigurationCompleted = Configuration of user {0} completed successfully.
|
||||
UserCreated = User {0} created successfully.
|
||||
UserUpdated = User {0} properties updated successfully.
|
||||
UserRemoved = User {0} removed successfully.
|
||||
NoConfigurationRequired = User {0} exists on this node with the desired properties. No action required.
|
||||
NoConfigurationRequiredUserDoesNotExist = User {0} does not exist on this node. No action required.
|
||||
InvalidUserName = The name {0} cannot be used. Names may not consist entirely of periods and/or spaces, or contain these characters: {1}
|
||||
UserExists = A user with the name {0} exists.
|
||||
UserDoesNotExist = A user with the name {0} does not exist.
|
||||
PropertyMismatch = The value of the {0} property is expected to be {1} but it is {2}.
|
||||
PasswordPropertyMismatch = The value of the {0} property does not match.
|
||||
AllUserPropertisMatch = All {0} {1} properties match.
|
||||
ConnectionError = There could be a possible connection error while trying to use the System.DirectoryServices API's.
|
||||
MultipleMatches = There could be a possible multiple matches exception while trying to use the System.DirectoryServices API's.
|
||||
'@
|
||||
@@ -0,0 +1,16 @@
|
||||
Configuration UserExample
|
||||
{
|
||||
param (
|
||||
[System.Management.Automation.PSCredential]
|
||||
$PasswordCredential
|
||||
)
|
||||
|
||||
Import-DscResource -ModuleName PSDscResources
|
||||
|
||||
User UserExample
|
||||
{
|
||||
Ensure = 'Present' # To ensure the user account does not exist, set Ensure to "Absent"
|
||||
UserName = 'SomeUserName'
|
||||
Password = $PasswordCredential # This needs to be a credential object
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
param
|
||||
(
|
||||
[Parameter(Mandatory)]
|
||||
[System.String]
|
||||
$ConfigurationName
|
||||
)
|
||||
|
||||
<#
|
||||
Create a custom configuration by passing in whatever
|
||||
values you need. $Password is the only param that is
|
||||
required since it must be a PSCredential object.
|
||||
If you want to create a user with minimal attributes,
|
||||
every param except username can be deleted since they
|
||||
are optional.
|
||||
#>
|
||||
|
||||
Configuration $ConfigurationName
|
||||
{
|
||||
param
|
||||
(
|
||||
[System.String]
|
||||
$UserName = 'Test UserName',
|
||||
|
||||
[System.String]
|
||||
$Description = 'Test Description',
|
||||
|
||||
[System.String]
|
||||
$FullName = 'Test Full Name',
|
||||
|
||||
[ValidateSet('Present', 'Absent')]
|
||||
[System.String]
|
||||
$Ensure = 'Present',
|
||||
|
||||
[Parameter(Mandatory)]
|
||||
[System.Management.Automation.PSCredential]
|
||||
$Password,
|
||||
|
||||
[System.Boolean]
|
||||
$Disabled = $false,
|
||||
|
||||
[System.Boolean]
|
||||
$PasswordNeverExpires = $false,
|
||||
|
||||
[System.Boolean]
|
||||
$PasswordChangeRequired = $false,
|
||||
|
||||
[System.Boolean]
|
||||
$PasswordChangeNotAllowed = $false
|
||||
)
|
||||
|
||||
Import-DscResource -ModuleName 'PSDscResources'
|
||||
|
||||
Node Localhost {
|
||||
|
||||
User UserResource1
|
||||
{
|
||||
UserName = $UserName
|
||||
Ensure = $Ensure
|
||||
FullName = $FullName
|
||||
Description = $Description
|
||||
Password = $Password
|
||||
Disabled = $Disabled
|
||||
PasswordNeverExpires = $PasswordNeverExpires
|
||||
PasswordChangeRequired = $PasswordChangeRequired
|
||||
PasswordChangeNotAllowed = $PasswordChangeNotAllowed
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
<#
|
||||
To run these tests, the currently logged on user must have rights to create a user.
|
||||
These integration tests cover creating a brand new user, updating values
|
||||
of a user that already exists, and deleting a user that exists.
|
||||
#>
|
||||
|
||||
# Suppressing this rule since we need to create a plaintext password to test this resource
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')]
|
||||
param ()
|
||||
|
||||
Import-Module -Name (Join-Path -Path (Split-Path $PSScriptRoot -Parent) `
|
||||
-ChildPath 'CommonTestHelper.psm1') `
|
||||
-Force
|
||||
|
||||
$script:testEnvironment = Enter-DscResourceTestEnvironment `
|
||||
-DscResourceModuleName 'PSDscResources' `
|
||||
-DscResourceName 'MSFT_UserResource' `
|
||||
-TestType 'Integration'
|
||||
|
||||
try {
|
||||
|
||||
$configFile = Join-Path -Path $PSScriptRoot -ChildPath 'MSFT_UserResource.config.ps1'
|
||||
|
||||
|
||||
Describe 'UserResource Integration Tests' {
|
||||
$ConfigData = @{
|
||||
AllNodes = @(
|
||||
@{
|
||||
NodeName = '*'
|
||||
PSDscAllowPlainTextPassword = $true
|
||||
}
|
||||
@{
|
||||
NodeName = 'localhost'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
Context 'Should create a new user' {
|
||||
$configurationName = 'MSFT_User_NewUser'
|
||||
$configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName
|
||||
|
||||
$logPath = Join-Path -Path $TestDrive -ChildPath 'NewUser.log'
|
||||
|
||||
$testUserName = 'TestUserName12345'
|
||||
$testUserPassword = 'StrongOne7.'
|
||||
$testDescription = 'Test Description'
|
||||
$secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
|
||||
$testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)
|
||||
|
||||
try
|
||||
{
|
||||
It 'Should compile without throwing' {
|
||||
{
|
||||
. $configFile -ConfigurationName $configurationName
|
||||
& $configurationName -UserName $testUserName `
|
||||
-Password $testCredential `
|
||||
-Description $testDescription `
|
||||
-OutputPath $configurationPath `
|
||||
-ConfigurationData $ConfigData `
|
||||
-ErrorAction Stop
|
||||
Start-DscConfiguration -Path $configurationPath -Wait -Force
|
||||
} | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should be able to call Get-DscConfiguration without throwing' {
|
||||
{ Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should return the correct configuration' {
|
||||
$currentConfig = Get-DscConfiguration -Verbose -ErrorAction Stop
|
||||
$currentConfig.UserName | Should Be $testUserName
|
||||
$currentConfig.Ensure | Should Be 'Present'
|
||||
$currentConfig.Description | Should Be $TestDescription
|
||||
$currentConfig.Disabled | Should Be $false
|
||||
$currentConfig.PasswordChangeRequired | Should Be $null
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (Test-Path -Path $logPath) {
|
||||
Remove-Item -Path $logPath -Recurse -Force
|
||||
}
|
||||
|
||||
if (Test-Path -Path $configurationPath)
|
||||
{
|
||||
Remove-Item -Path $configurationPath -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Should update an existing user' {
|
||||
$configurationName = 'MSFT_User_UpdateUser'
|
||||
$configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName
|
||||
|
||||
$logPath = Join-Path -Path $TestDrive -ChildPath 'UpdateUser.log'
|
||||
|
||||
$testUserName = 'TestUserName12345'
|
||||
$testUserPassword = 'StrongOne7.'
|
||||
$testDescription = 'New Test Description'
|
||||
$secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
|
||||
$testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)
|
||||
|
||||
try
|
||||
{
|
||||
It 'Should compile without throwing' {
|
||||
{
|
||||
. $configFile -ConfigurationName $configurationName
|
||||
& $configurationName -UserName $testUserName `
|
||||
-Password $testCredential `
|
||||
-Description $testDescription `
|
||||
-OutputPath $configurationPath `
|
||||
-ConfigurationData $ConfigData `
|
||||
-ErrorAction Stop
|
||||
Start-DscConfiguration -Path $configurationPath -Wait -Force
|
||||
} | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should be able to call Get-DscConfiguration without throwing' {
|
||||
{ Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should return the correct configuration' {
|
||||
$currentConfig = Get-DscConfiguration -Verbose -ErrorAction Stop
|
||||
$currentConfig.UserName | Should Be $testUserName
|
||||
$currentConfig.Ensure | Should Be 'Present'
|
||||
$currentConfig.Description | Should Be $TestDescription
|
||||
$currentConfig.Disabled | Should Be $false
|
||||
$currentConfig.PasswordChangeRequired | Should Be $null
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (Test-Path -Path $logPath) {
|
||||
Remove-Item -Path $logPath -Recurse -Force
|
||||
}
|
||||
|
||||
if (Test-Path -Path $configurationPath)
|
||||
{
|
||||
Remove-Item -Path $configurationPath -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Should delete an existing user' {
|
||||
$configurationName = 'MSFT_User_DeleteUser'
|
||||
$configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName
|
||||
|
||||
$logPath = Join-Path -Path $TestDrive -ChildPath 'DeleteUser.log'
|
||||
|
||||
$testUserName = 'TestUserName12345'
|
||||
$testUserPassword = 'StrongOne7.'
|
||||
$secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
|
||||
$testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)
|
||||
|
||||
try
|
||||
{
|
||||
It 'Should compile without throwing' {
|
||||
{
|
||||
. $configFile -ConfigurationName $configurationName
|
||||
& $configurationName -UserName $testUserName `
|
||||
-Password $testCredential `
|
||||
-OutputPath $configurationPath `
|
||||
-ConfigurationData $ConfigData `
|
||||
-Ensure 'Absent' `
|
||||
-ErrorAction Stop
|
||||
Start-DscConfiguration -Path $configurationPath -Wait -Force
|
||||
} | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should be able to call Get-DscConfiguration without throwing' {
|
||||
{ Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should return the correct configuration' {
|
||||
$currentConfig = Get-DscConfiguration -Verbose -ErrorAction Stop
|
||||
$currentConfig.UserName | Should Be $testUserName
|
||||
$currentConfig.Ensure | Should Be 'Absent'
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (Test-Path -Path $logPath) {
|
||||
Remove-Item -Path $logPath -Recurse -Force
|
||||
}
|
||||
|
||||
if (Test-Path -Path $configurationPath)
|
||||
{
|
||||
Remove-Item -Path $configurationPath -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Exit-DscResourceTestEnvironment -TestEnvironment $script:testEnvironment
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
# Integration Test Config Template Version 1.0.0
|
||||
param
|
||||
(
|
||||
[Parameter(Mandatory)]
|
||||
[System.String]
|
||||
$ConfigurationName
|
||||
)
|
||||
|
||||
|
||||
Configuration $ConfigurationName
|
||||
{
|
||||
param
|
||||
(
|
||||
[System.String]
|
||||
$UserName = 'Test UserName',
|
||||
|
||||
[System.String]
|
||||
$Description = 'Test Description',
|
||||
|
||||
[System.String]
|
||||
$FullName = 'Test Full Name',
|
||||
|
||||
[ValidateSet('Present', 'Absent')]
|
||||
[System.String]
|
||||
$Ensure = 'Present',
|
||||
|
||||
[Parameter(Mandatory)]
|
||||
[System.Management.Automation.PSCredential]
|
||||
$Password
|
||||
)
|
||||
|
||||
Import-DscResource -ModuleName 'PSDscResources'
|
||||
|
||||
Node Localhost {
|
||||
|
||||
User UserResource1
|
||||
{
|
||||
UserName = $UserName
|
||||
Ensure = $Ensure
|
||||
FullName = $FullName
|
||||
Description = $Description
|
||||
Password = $Password
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,468 @@
|
||||
Import-Module "$PSScriptRoot\..\..\DSCResources\CommonResourceHelper.psm1" -Force
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Tests if a scope represents the current machine.
|
||||
|
||||
.PARAMETER Scope
|
||||
The scope to test.
|
||||
#>
|
||||
function Test-IsLocalMachine
|
||||
{
|
||||
[OutputType([System.Boolean])]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[System.String]
|
||||
$Scope
|
||||
)
|
||||
|
||||
Set-StrictMode -Version latest
|
||||
|
||||
if ($scope -eq '.')
|
||||
{
|
||||
return $true
|
||||
}
|
||||
|
||||
if ($scope -eq $env:COMPUTERNAME)
|
||||
{
|
||||
return $true
|
||||
}
|
||||
|
||||
if ($scope -eq 'localhost')
|
||||
{
|
||||
return $true
|
||||
}
|
||||
|
||||
if ($scope.Contains('.'))
|
||||
{
|
||||
if ($scope -eq '127.0.0.1')
|
||||
{
|
||||
return $true
|
||||
}
|
||||
|
||||
# Determine if we have an ip address that matches an ip address on one of the network adapters.
|
||||
# NOTE: This is likely overkill; consider removing it.
|
||||
$networkAdapters = @(Get-CimInstance Win32_NetworkAdapterConfiguration)
|
||||
foreach ($networkAdapter in $networkAdapters)
|
||||
{
|
||||
if ($null -ne $networkAdapter.IPAddress)
|
||||
{
|
||||
foreach ($address in $networkAdapter.IPAddress)
|
||||
{
|
||||
if ($address -eq $scope)
|
||||
{
|
||||
return $true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Creates a user account.
|
||||
|
||||
.DESCRIPTION
|
||||
This function creates a user on the local or remote machine.
|
||||
|
||||
.PARAMETER Credential
|
||||
The credential containing the username and password to use to create the account.
|
||||
|
||||
.PARAMETER Description
|
||||
The optional description to set on the user account.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update. Omit to create a user on the local machine.
|
||||
|
||||
.NOTES
|
||||
For remote machines, the currently logged on user must have rights to create a user.
|
||||
#>
|
||||
function New-User
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.Management.Automation.PSCredential]
|
||||
[System.Management.Automation.Credential()]
|
||||
$Credential,
|
||||
|
||||
[System.String]
|
||||
$Description,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
if (Test-IsNanoServer)
|
||||
{
|
||||
New-UserOnNanoServer @PSBoundParameters
|
||||
}
|
||||
else
|
||||
{
|
||||
New-UserOnFullSKU @PSBoundParameters
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Creates a user account on a full server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function creates a user on the local or remote machine running a full server.
|
||||
|
||||
.PARAMETER Credential
|
||||
The credential containing the username and password to use to create the account.
|
||||
|
||||
.PARAMETER Description
|
||||
The optional description to set on the user account.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update. Omit to create a user on the local machine.
|
||||
|
||||
.NOTES
|
||||
For remote machines, the currently logged on user must have rights to create a user.
|
||||
#>
|
||||
function New-UserOnFullSKU
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.Management.Automation.PSCredential]
|
||||
[System.Management.Automation.Credential()]
|
||||
$Credential,
|
||||
|
||||
[System.String]
|
||||
$Description,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$userName = $Credential.UserName
|
||||
$password = $Credential.GetNetworkCredential().Password
|
||||
|
||||
# Remove user if it already exists.
|
||||
Remove-User $userName $ComputerName
|
||||
|
||||
$adComputerEntry = [ADSI] "WinNT://$ComputerName"
|
||||
$adUserEntry = $adComputerEntry.Create('User', $userName)
|
||||
$null = $adUserEntry.SetPassword($password)
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('Description'))
|
||||
{
|
||||
$null = $adUserEntry.Put('Description', $Description)
|
||||
}
|
||||
|
||||
$null = $adUserEntry.SetInfo()
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Creates a user account on a Nano server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function creates a user on the local machine running a Nano server.
|
||||
|
||||
.PARAMETER Credential
|
||||
The credential containing the username and password to use to create the account.
|
||||
|
||||
.PARAMETER Description
|
||||
The optional description to set on the user account.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
This parameter should not be used on NanoServer.
|
||||
#>
|
||||
function New-UserOnNanoServer
|
||||
{
|
||||
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.Management.Automation.PSCredential]
|
||||
[System.Management.Automation.CredentialAttribute()]
|
||||
$Credential,
|
||||
|
||||
[System.String]
|
||||
$Description,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('ComputerName'))
|
||||
{
|
||||
if (-not (Test-IsLocalMachine -Scope $ComputerName))
|
||||
{
|
||||
throw 'Do not specify the ComputerName arguments when running on NanoServer unless it is local machine.'
|
||||
}
|
||||
}
|
||||
|
||||
$userName = $Credential.UserName
|
||||
$securePassword = $Credential.GetNetworkCredential().SecurePassword
|
||||
|
||||
# Remove user if it already exists.
|
||||
Remove-LocalUser -Name $userName -ErrorAction SilentlyContinue
|
||||
|
||||
New-LocalUser -Name $userName -Password $securePassword
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('Description'))
|
||||
{
|
||||
Set-LocalUser -Name $userName -Description $Description
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes a user account.
|
||||
|
||||
.DESCRIPTION
|
||||
This function removes a local user from the local or remote machine.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to remove.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update. Omit to remove the user on the local machine.
|
||||
|
||||
.NOTES
|
||||
For remote machines, the currently logged on user must have rights to remove a user.
|
||||
#>
|
||||
function Remove-User
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
if (Test-IsNanoServer)
|
||||
{
|
||||
Remove-UserOnNanoServer @PSBoundParameters
|
||||
}
|
||||
else
|
||||
{
|
||||
Remove-UserOnFullSKU @PSBoundParameters
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes a user account on a full server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function removes a local user from the local or remote machine running a full server.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to remove.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update. Omit to remove the user on the local machine.
|
||||
|
||||
.NOTES
|
||||
For remote machines, the currently logged on user must have rights to remove a user.
|
||||
#>
|
||||
function Remove-UserOnFullSKU
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$adComputerEntry = [ADSI] "WinNT://$ComputerName"
|
||||
|
||||
if ($adComputerEntry.Children | Where-Object Path -like "WinNT://*$ComputerName/$UserName")
|
||||
{
|
||||
$null = $adComputerEntry.Delete('user', $UserName)
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Removes a local user account on a Nano server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function removes a local user from the local machine running a Nano Server.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to remove.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
This parameter should not be used on NanoServer.
|
||||
#>
|
||||
function Remove-UserOnNanoServer
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory=$true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('ComputerName'))
|
||||
{
|
||||
if (-not (Test-IsLocalMachine -Scope $ComputerName))
|
||||
{
|
||||
throw 'Do not specify the ComputerName arguments when running on NanoServer unless it is local machine.'
|
||||
}
|
||||
}
|
||||
|
||||
Remove-LocalUser -Name $UserName
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Determines if a user exists..
|
||||
|
||||
.DESCRIPTION
|
||||
This function determines if a user exists on a local or remote machine running.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to test.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update.
|
||||
#>
|
||||
function Test-User
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
if (Test-IsNanoServer)
|
||||
{
|
||||
Test-UserOnNanoServer @PSBoundParameters
|
||||
}
|
||||
else
|
||||
{
|
||||
Test-UserOnFullSKU @PSBoundParameters
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Determines if a user exists on a full server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function determines if a user exists on a local or remote machine running a full server.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to test.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
The optional name of the computer to update.
|
||||
#>
|
||||
function Test-UserOnFullSKU
|
||||
{
|
||||
[OutputType([System.Boolean])]
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
$adComputerEntry = [ADSI] "WinNT://$ComputerName"
|
||||
if ($adComputerEntry.Children | Where-Object Path -like "WinNT://*$ComputerName/$UserName")
|
||||
{
|
||||
return $true
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Determines if a user exists on a Nano server.
|
||||
|
||||
.DESCRIPTION
|
||||
This function determines if a user exists on a local or remote machine running a Nano server.
|
||||
|
||||
.PARAMETER UserName
|
||||
The name of the user to test.
|
||||
|
||||
.PARAMETER ComputerName
|
||||
This parameter should not be used on NanoServer.
|
||||
#>
|
||||
function Test-UserOnNanoServer
|
||||
{
|
||||
[OutputType([System.Boolean])]
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]
|
||||
$UserName,
|
||||
|
||||
[System.String]
|
||||
$ComputerName = $env:COMPUTERNAME
|
||||
)
|
||||
|
||||
if ($PSBoundParameters.ContainsKey('ComputerName'))
|
||||
{
|
||||
if (-not (Test-IsLocalMachine -Scope $ComputerName))
|
||||
{
|
||||
throw 'Do not specify the ComputerName arguments when running on NanoServer unless it is local machine.'
|
||||
}
|
||||
}
|
||||
|
||||
# Try to find a group by its name.
|
||||
try
|
||||
{
|
||||
$null = Get-LocalUser -Name $UserName -ErrorAction Stop
|
||||
return $true
|
||||
}
|
||||
catch [System.Exception]
|
||||
{
|
||||
if ($_.CategoryInfo.ToString().Contains('UserNotFoundException'))
|
||||
{
|
||||
# A user with the provided name does not exist.
|
||||
return $false
|
||||
}
|
||||
throw $_.Exception
|
||||
}
|
||||
finally
|
||||
{
|
||||
Remove-LocalUser -Name $UserName
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
Export-ModuleMember -Function `
|
||||
New-User, `
|
||||
Remove-User, `
|
||||
Test-IsLocalMachine, `
|
||||
Test-User
|
||||
@@ -0,0 +1,448 @@
|
||||
# To run these tests, the currently logged on user must have rights to create a user
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')]
|
||||
param ()
|
||||
|
||||
Import-Module -Name (Join-Path -Path (Split-Path $PSScriptRoot -Parent) `
|
||||
-ChildPath 'CommonTestHelper.psm1') `
|
||||
-Force
|
||||
|
||||
$script:testEnvironment = Enter-DscResourceTestEnvironment `
|
||||
-DSCResourceModuleName 'PSDscResources' `
|
||||
-DSCResourceName 'MSFT_UserResource' `
|
||||
-TestType Unit
|
||||
|
||||
try {
|
||||
|
||||
Import-Module -Name (Join-Path -Path $PSScriptRoot `
|
||||
-ChildPath 'MSFT_UserResource.TestHelper.psm1') `
|
||||
-Force
|
||||
|
||||
InModuleScope 'MSFT_UserResource' {
|
||||
# Used to skip the Nano server tests for the time being since they are not working on AppVeyor
|
||||
|
||||
$script:skipMe = $true
|
||||
|
||||
$existingUserName = 'TestUserName12345'
|
||||
$existingUserPassword = 'StrongOne7.'
|
||||
$existingDescription = 'Some Description'
|
||||
$existingSecurePassword = ConvertTo-SecureString $existingUserPassword -AsPlainText -Force
|
||||
$existingTestCredential = New-Object PSCredential ($existingUserName, $existingSecurePassword)
|
||||
|
||||
New-User -Credential $existingTestCredential -Description $existingDescription
|
||||
|
||||
$newUserName1 = 'NewTestUserName12345'
|
||||
$newUserPassword1 = 'NewStrongOne123.'
|
||||
$newFullName1 = 'Fullname1'
|
||||
$newUserDescription1 = 'New Description1'
|
||||
$newSecurePassword1 = ConvertTo-SecureString $newUserPassword1 -AsPlainText -Force
|
||||
$newCredential1 = New-Object PSCredential ($newUserName1, $newSecurePassword1)
|
||||
|
||||
$newUserName2 = 'newUser1234'
|
||||
$newPassword2 = 'ThisIsAStrongPassword543!'
|
||||
$newFullName2 = 'Fullname2'
|
||||
$newUserDescription2 = 'New Description2'
|
||||
$newSecurePassword2 = ConvertTo-SecureString $newPassword2 -AsPlainText -Force
|
||||
$newCredential2 = New-Object PSCredential ($newUserName2, $newSecurePassword2)
|
||||
|
||||
try {
|
||||
|
||||
Describe 'UserResource/Get-TargetResource' {
|
||||
|
||||
Context 'Tests on FullSKU' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $false }
|
||||
|
||||
It 'Should return the user as Present' {
|
||||
$getTargetResourceResult = Get-TargetResource $existingUserName
|
||||
|
||||
$getTargetResourceResult['UserName'] | Should Be $existingUserName
|
||||
$getTargetResourceResult['Ensure'] | Should Be 'Present'
|
||||
$getTargetResourceResult['Description'] | Should Be $existingDescription
|
||||
$getTargetResourceResult['PasswordChangeRequired'] | Should Be $null
|
||||
}
|
||||
|
||||
It 'Should return the user as Absent' {
|
||||
$getTargetResourceResult = Get-TargetResource 'NotAUserName'
|
||||
|
||||
$getTargetResourceResult['UserName'] | Should Be 'NotAUserName'
|
||||
$getTargetResourceResult['Ensure'] | Should Be 'Absent'
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Tests on Nano Server' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $true }
|
||||
|
||||
It 'Should return the user as Present on Nano Server' -Skip:$script:skipMe {
|
||||
$getTargetResourceResult = Get-TargetResource $existingUserName
|
||||
|
||||
$getTargetResourceResult['UserName'] | Should Be $existingUserName
|
||||
$getTargetResourceResult['Ensure'] | Should Be 'Present'
|
||||
$getTargetResourceResult['Description'] | Should Be $existingDescription
|
||||
$getTargetResourceResult['PasswordChangeRequired'] | Should Be $null
|
||||
}
|
||||
|
||||
It 'Should return the user as Absent' -Skip:$script:skipMe {
|
||||
$getTargetResourceResult = Get-TargetResource 'NotAUserName'
|
||||
|
||||
$getTargetResourceResult['UserName'] | Should Be 'NotAUserName'
|
||||
$getTargetResourceResult['Ensure'] | Should Be 'Absent'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'UserResource/Set-TargetResource' {
|
||||
Context 'Tests on FullSKU' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $false }
|
||||
|
||||
try
|
||||
{
|
||||
New-User -Credential $newCredential1 -Description $newUserDescription1
|
||||
|
||||
It 'Should remove the user' {
|
||||
Test-User -UserName $newUserName1 | Should Be $true
|
||||
Set-TargetResource -UserName $newUserName1 -Ensure 'Absent'
|
||||
Test-User -UserName $newUserName1 | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should add the new user' {
|
||||
Set-TargetResource -UserName $newUserName2 -Password $newCredential2 -Ensure 'Present'
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should update the user' {
|
||||
$disabled = $false
|
||||
$passwordNeverExpires = $true
|
||||
$passwordChangeRequired = $false
|
||||
$passwordChangeNotAllowed = $true
|
||||
|
||||
Set-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential2 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName1 `
|
||||
-Description $newUserDescription1 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeRequired $passwordChangeRequired `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
$testTargetResourceResult1 =
|
||||
Test-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential2 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName1 `
|
||||
-Description $newUserDescription1 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
$testTargetResourceResult1 | Should Be $true
|
||||
}
|
||||
It 'Should update the user again with different values' {
|
||||
$disabled = $false
|
||||
$passwordNeverExpires = $false
|
||||
$passwordChangeRequired = $true
|
||||
$passwordChangeNotAllowed = $false
|
||||
|
||||
Set-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential1 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName2 `
|
||||
-Description $newUserDescription2 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeRequired $passwordChangeRequired `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
$testTargetResourceResult2 =
|
||||
Test-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential1 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName2 `
|
||||
-Description $newUserDescription2 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
$testTargetResourceResult2 | Should Be $true
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Remove-User -UserName $newUserName1
|
||||
Remove-User -UserName $newUserName2
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Tests on Nano Server' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $true }
|
||||
Mock -CommandName Test-CredentialsValidOnNanoServer { return $true }
|
||||
|
||||
try
|
||||
{
|
||||
New-User -Credential $newCredential1 -Description $newUserDescription1
|
||||
|
||||
It 'Should remove the user' -Skip:$script:skipMe {
|
||||
Test-User -UserName $newUserName1 | Should Be $true
|
||||
Set-TargetResource -UserName $newUserName1 -Ensure 'Absent'
|
||||
Test-User -UserName $newUserName1 | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should add the new user' -Skip:$script:skipMe {
|
||||
Set-TargetResource -UserName $newUserName2 -Password $newCredential2 -Ensure 'Present'
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should update the user' -Skip:$script:skipMe {
|
||||
$disabled = $false
|
||||
$passwordNeverExpires = $true
|
||||
$passwordChangeRequired = $false
|
||||
$passwordChangeNotAllowed = $true
|
||||
|
||||
Set-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential2 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName1 `
|
||||
-Description $newUserDescription1 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeRequired $passwordChangeRequired `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
$testTargetResourceResult1 =
|
||||
Test-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential2 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName1 `
|
||||
-Description $newUserDescription1 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
$testTargetResourceResult1 | Should Be $true
|
||||
}
|
||||
It 'Should update the user again with different values' -Skip:$script:skipMe {
|
||||
$disabled = $false
|
||||
$passwordNeverExpires = $false
|
||||
$passwordChangeRequired = $true
|
||||
$passwordChangeNotAllowed = $false
|
||||
|
||||
Set-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential1 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName2 `
|
||||
-Description $newUserDescription2 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeRequired $passwordChangeRequired `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
|
||||
Test-User -UserName $newUserName2 | Should Be $true
|
||||
$testTargetResourceResult2 =
|
||||
Test-TargetResource -UserName $newUserName2 `
|
||||
-Password $newCredential1 `
|
||||
-Ensure 'Present' `
|
||||
-FullName $newFullName2 `
|
||||
-Description $newUserDescription2 `
|
||||
-Disabled $disabled `
|
||||
-PasswordNeverExpires $passwordNeverExpires `
|
||||
-PasswordChangeNotAllowed $passwordChangeNotAllowed
|
||||
$testTargetResourceResult2 | Should Be $true
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Remove-User -UserName $newUserName1
|
||||
Remove-User -UserName $newUserName2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'UserResource/Test-TargetResource' {
|
||||
Context 'Tests on FullSKU' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $false }
|
||||
$absentUserName = 'AbsentUserUserName123456789'
|
||||
|
||||
It 'Should return true when user Present and correct values' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Description $existingDescription `
|
||||
-Password $existingTestCredential `
|
||||
-Disabled $false `
|
||||
-PasswordNeverExpires $false `
|
||||
-PasswordChangeNotAllowed $false
|
||||
$testTargetResourceResult | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should return true when user Absent and Ensure = Absent' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $absentUserName `
|
||||
-Ensure 'Absent'
|
||||
$testTargetResourceResult | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should return false when user Absent and Ensure = Present' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $absentUserName `
|
||||
-Ensure 'Present'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when user Present and Ensure = Absent' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Ensure 'Absent'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when Password is wrong' {
|
||||
$badPassword = 'WrongPassword'
|
||||
$secureBadPassword = ConvertTo-SecureString $badPassword -AsPlainText -Force
|
||||
$badTestCredential = New-Object PSCredential ($existingUserName, $secureBadPassword)
|
||||
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Password $badTestCredential
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when user Present and wrong Description' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Description 'Wrong description'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when FullName is incorrect' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-FullName 'Wrong FullName'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when Disabled is incorrect' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Disabled $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when PasswordNeverExpires is incorrect' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-PasswordNeverExpires $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when PasswordChangeNotAllowed is incorrect' {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-PasswordChangeNotAllowed $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Tests on Nano Server' {
|
||||
Mock -CommandName Test-IsNanoServer -MockWith { return $true }
|
||||
|
||||
$absentUserName = 'AbsentUserUserName123456789'
|
||||
|
||||
It 'Should return true when user Present and correct values' -Skip:$script:skipMe {
|
||||
Mock -CommandName Test-CredentialsValidOnNanoServer { return $true }
|
||||
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Description $existingDescription `
|
||||
-Password $existingTestCredential `
|
||||
-Disabled $false `
|
||||
-PasswordNeverExpires $false `
|
||||
-PasswordChangeNotAllowed $false
|
||||
$testTargetResourceResult | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should return true when user Absent and Ensure = Absent' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $absentUserName `
|
||||
-Ensure 'Absent'
|
||||
$testTargetResourceResult | Should Be $true
|
||||
}
|
||||
|
||||
It 'Should return false when user Absent and Ensure = Present' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $absentUserName `
|
||||
-Ensure 'Present'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when user Present and Ensure = Absent' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Ensure 'Absent'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when Password is wrong' -Skip:$script:skipMe {
|
||||
Mock -CommandName Test-CredentialsValidOnNanoServer { return $false }
|
||||
|
||||
$badPassword = 'WrongPassword'
|
||||
$secureBadPassword = ConvertTo-SecureString $badPassword -AsPlainText -Force
|
||||
$badTestCredential = New-Object PSCredential ($existingUserName, $secureBadPassword)
|
||||
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Password $badTestCredential
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when user Present and wrong Description' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Description 'Wrong description'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when FullName is incorrect' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-FullName 'Wrong FullName'
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when Disabled is incorrect' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-Disabled $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when PasswordNeverExpires is incorrect' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-PasswordNeverExpires $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
|
||||
It 'Should return false when PasswordChangeNotAllowed is incorrect' -Skip:$script:skipMe {
|
||||
$testTargetResourceResult = Test-TargetResource -UserName $existingUserName `
|
||||
-PasswordChangeNotAllowed $true
|
||||
$testTargetResourceResult | Should Be $false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Describe 'UserResource/Assert-UserNameValid' {
|
||||
It 'Should not throw when username contains all valid chars' {
|
||||
{ Assert-UserNameValid -UserName 'abc123456!f_t-l098s' } | Should Not Throw
|
||||
}
|
||||
|
||||
It 'Should throw InvalidArgumentError when username contains only whitespace and dots' {
|
||||
$invalidName = ' . .. . '
|
||||
$errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument
|
||||
$errorId = 'UserNameHasOnlyWhiteSpacesAndDots'
|
||||
$errorMessage = "The name $invalidName cannot be used."
|
||||
$exception = New-Object System.ArgumentException $errorMessage;
|
||||
$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null
|
||||
{ Assert-UserNameValid -UserName $invalidName } | Should Throw $errorRecord
|
||||
}
|
||||
|
||||
It 'Should throw InvalidArgumentError when username contains an invalid char' {
|
||||
$invalidName = 'user|name'
|
||||
$errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument
|
||||
$errorId = 'UserNameHasInvalidCharachter'
|
||||
$errorMessage = "The name $invalidName cannot be used."
|
||||
$exception = New-Object System.ArgumentException $errorMessage;
|
||||
$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $null
|
||||
{ Assert-UserNameValid -UserName $invalidName } | Should Throw $errorRecord
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Remove-User -UserName $existingUserName
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Exit-DscResourceTestEnvironment -TestEnvironment $script:testEnvironment
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user