-
-
Save crshnbrn66/7e81bf20408c05ddb2b4fdf4498477d8 to your computer and use it in GitHub Desktop.
<# | |
.Synopsis | |
Rough PS functions to create new user profiles | |
.DESCRIPTION | |
Call the Create-NewProfile function directly to create a new profile | |
.EXAMPLE | |
Create-NewProfile -Username 'testUser1' -Password 'testUser1' | |
.NOTES | |
Created by: Josh Rickard (@MS_dministrator) and Thom Schumacher (@driberif) | |
Date: 24MAR2017 | |
Location: https://gist.github.com/crshnbrn66/7e81bf20408c05ddb2b4fdf4498477d8 | |
Contact: https://github.com/MSAdministrator | |
MSAdministrator.com | |
https://github.com/crshnbrn66 | |
powershellposse.com | |
#> | |
#Function to create the new local user first | |
function New-LocalUser | |
{ | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param | |
( | |
# Param1 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=0)] | |
$userName, | |
# Param2 help description | |
[string] | |
$password | |
) | |
$system = [ADSI]"WinNT://$env:COMPUTERNAME"; | |
$user = $system.Create("user",$userName); | |
$user.SetPassword($password); | |
$user.SetInfo(); | |
$flag=$user.UserFlags.value -bor 0x10000; | |
$user.put("userflags",$flag); | |
$user.SetInfo(); | |
$group = [ADSI]("WinNT://$env:COMPUTERNAME/Users"); | |
$group.PSBase.Invoke("Add", $user.PSBase.Path); | |
} | |
#function to register a native method | |
function Register-NativeMethod | |
{ | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param | |
( | |
# Param1 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=0)] | |
[string]$dll, | |
# Param2 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=1)] | |
[string] | |
$methodSignature | |
) | |
$script:nativeMethods += [PSCustomObject]@{ Dll = $dll; Signature = $methodSignature; } | |
} | |
function Get-Win32LastError | |
{ | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param($typeName = 'LastError') | |
if (-not ([System.Management.Automation.PSTypeName]$typeName).Type) | |
{ | |
$lasterrorCode = $script:lasterror | ForEach-Object{ | |
'[DllImport("kernel32.dll", SetLastError = true)] | |
public static extern uint GetLastError();' | |
} | |
Add-Type @" | |
using System; | |
using System.Text; | |
using System.Runtime.InteropServices; | |
public static class $typeName { | |
$lasterrorCode | |
} | |
"@ | |
} | |
} | |
#function to add native method | |
function Add-NativeMethods | |
{ | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param($typeName = 'NativeMethods') | |
$nativeMethodsCode = $script:nativeMethods | ForEach-Object { " | |
[DllImport(`"$($_.Dll)`")] | |
public static extern $($_.Signature); | |
" } | |
Add-Type @" | |
using System; | |
using System.Text; | |
using System.Runtime.InteropServices; | |
public static class $typeName { | |
$nativeMethodsCode | |
} | |
"@ | |
} | |
#Main function to create the new user profile | |
function Create-NewProfile { | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param | |
( | |
# Param1 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=0)] | |
[string]$UserName, | |
# Param2 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=1)] | |
[string] | |
$Password | |
) | |
Write-Verbose "Creating local user $Username"; | |
try | |
{ | |
New-LocalUser -username $UserName -password $Password; | |
} | |
catch | |
{ | |
Write-Error $_.Exception.Message; | |
break; | |
} | |
$methodName = 'UserEnvCP' | |
$script:nativeMethods = @(); | |
if (-not ([System.Management.Automation.PSTypeName]$MethodName).Type) | |
{ | |
Register-NativeMethod "userenv.dll" "int CreateProfile([MarshalAs(UnmanagedType.LPWStr)] string pszUserSid,` | |
[MarshalAs(UnmanagedType.LPWStr)] string pszUserName,` | |
[Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath)"; | |
Add-NativeMethods -typeName $MethodName; | |
} | |
$localUser = New-Object System.Security.Principal.NTAccount("$UserName"); | |
$userSID = $localUser.Translate([System.Security.Principal.SecurityIdentifier]); | |
$sb = new-object System.Text.StringBuilder(260); | |
$pathLen = $sb.Capacity; | |
Write-Verbose "Creating user profile for $Username"; | |
try | |
{ | |
[UserEnvCP]::CreateProfile($userSID.Value, $Username, $sb, $pathLen) | Out-Null; | |
} | |
catch | |
{ | |
Write-Error $_.Exception.Message; | |
break; | |
} | |
} | |
function New-ProfileFromSID { | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param | |
( | |
# Param1 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=0)] | |
[string]$UserName, | |
[string]$domain = 'PHCORP' | |
) | |
$methodname = 'UserEnvCP2' | |
$script:nativeMethods = @(); | |
if (-not ([System.Management.Automation.PSTypeName]$methodname).Type) | |
{ | |
Register-NativeMethod "userenv.dll" "int CreateProfile([MarshalAs(UnmanagedType.LPWStr)] string pszUserSid,` | |
[MarshalAs(UnmanagedType.LPWStr)] string pszUserName,` | |
[Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath)"; | |
Add-NativeMethods -typeName $methodname; | |
} | |
$sb = new-object System.Text.StringBuilder(260); | |
$pathLen = $sb.Capacity; | |
Write-Verbose "Creating user profile for $Username"; | |
#$SID= ((get-aduser -id $UserName -ErrorAction Stop).sid.value) | |
if($domain) | |
{ | |
$objUser = New-Object System.Security.Principal.NTAccount($domain, $UserName) | |
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) | |
$SID = $strSID.Value | |
} | |
else | |
{ | |
$objUser = New-Object System.Security.Principal.NTAccount($UserName) | |
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) | |
$SID = $strSID.Value | |
} | |
Write-Verbose "$UserName SID: $SID" | |
try | |
{ | |
$result = [UserEnvCP2]::CreateProfile($SID, $Username, $sb, $pathLen) | |
if($result -eq '-2147024713') | |
{ | |
$status = "$userName already exists" | |
write-verbose "$username Creation Result: $result" | |
} | |
elseif($result -eq '-2147024809') | |
{ | |
$staus = "$username Not Found" | |
write-verbose "$username creation result: $result" | |
} | |
elseif($result -eq 0) | |
{ | |
$status = "$username Profile has been created" | |
write-verbose "$username Creation Result: $result" | |
} | |
else | |
{ | |
$status = "$UserName unknown return result: $result" | |
} | |
} | |
catch | |
{ | |
Write-Error $_.Exception.Message; | |
break; | |
} | |
$status | |
} | |
Function Remove-Profile { | |
[CmdletBinding()] | |
[Alias()] | |
[OutputType([int])] | |
Param | |
( | |
# Param1 help description | |
[Parameter(Mandatory=$true, | |
ValueFromPipelineByPropertyName=$true, | |
Position=0)] | |
[string]$UserName, | |
[string]$ProfilePath, | |
[string]$domain = 'PHCORP' | |
) | |
$methodname = 'userenvDP' | |
$script:nativeMethods = @(); | |
if (-not ([System.Management.Automation.PSTypeName]"$methodname.profile").Type) | |
{ | |
add-type @" | |
using System.Runtime.InteropServices; | |
namespace $typename | |
{ | |
public static class UserEnv | |
{ | |
[DllImport("userenv.dll", CharSet = CharSet.Unicode, ExactSpelling = false, SetLastError = true)] | |
public static extern bool DeleteProfile(string sidString, string profilePath, string computerName); | |
[DllImport("kernel32.dll")] | |
public static extern uint GetLastError(); | |
} | |
public static class Profile | |
{ | |
public static uint Delete(string sidString) | |
{ //Profile path and computer name are optional | |
if (!UserEnv.DeleteProfile(sidString, null, null)) | |
{ | |
return UserEnv.GetLastError(); | |
} | |
return 0; | |
} | |
} | |
} | |
"@ | |
} | |
#$SID= ((get-aduser -id $UserName -ErrorAction Stop).sid.value) | |
if($domain) | |
{ | |
$objUser = New-Object System.Security.Principal.NTAccount($domain, $UserName) | |
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) | |
$SID = $strSID.Value | |
} | |
else | |
{ | |
$objUser = New-Object System.Security.Principal.NTAccount($UserName) | |
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) | |
$SID = $strSID.Value | |
} | |
Write-Verbose "$UserName SID: $SID" | |
try | |
{ | |
#http://stackoverflow.com/questions/31949002/c-sharp-delete-user-profile | |
$result = [userenvDP.Profile]::Delete($SID) | |
} | |
catch | |
{ | |
Write-Error $_.Exception.Message; | |
break; | |
} | |
$LastError | |
} |
What license would you attribute to this code? Is it enough to maintain the header to include it in open source SW?
what is your concern?
Just don't want to pull it into a project if the license (or lack there of) would be incompatible.
I"m not aware of a license issue... I'd suggest you look on http://pinvoke.net/ to see what their rules / licensing is there..
Would this work to create a profile for a AD domain user?
CreateProfile is working great. Remove-Profile is not working. I get the following error.
add-type : c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : Identifier expected c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(2) : c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : >>> namespace c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : { At C:\PS\user-profile.psm1:281 char:7
add-type @"
~~~~~~~~~~~
- CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Except
ion- FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
add-type : c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : Identifier expected c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : namespace c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : >>> { c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(5) : public static class UserEnv At C:\PS\user-profile.psm1:281 char:7
add-type @"
~~~~~~~~~~~
- CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Except
ion- FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
add-type : Cannot add type. Compilation errors occurred. At C:\PS\user-profile.psm1:281 char:7
add-type @"
~~~~~~~~~~~
- CategoryInfo : InvalidData: (:) [Add-Type], InvalidOperationException
- FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand
Remove-Profile : Unable to find type [userenvDP.Profile]. At C:\PS\newUser.ps1:2 char:1
- Remove-Profile -UserName 'vcsois3' -ProfilePath 'C:\Users\vcsois3' -d ...
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Remove-Profile
I'm getting the same error. This function would be really useful if it could be sorted out
CreateProfile is working great. Remove-Profile is not working. I get the following error.
add-type : c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : Identifier expected
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(2) :
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : >>> namespace
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : {
At C:\PS\user-profile.psm1:281 char:7
ion
add-type : c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : Identifier expected
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(3) : namespace
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(4) : >>> {
c:\Users\pharding\AppData\Local\Temp\tj4e34oe\tj4e34oe.0.cs(5) : public static class UserEnv
At C:\PS\user-profile.psm1:281 char:7
ion
add-type : Cannot add type. Compilation errors occurred.
At C:\PS\user-profile.psm1:281 char:7
Remove-Profile : Unable to find type [userenvDP.Profile].
At C:\PS\newUser.ps1:2 char:1