1
2<#
3.Synopsis
4 Rough PS functions to create new user profiles
5.DESCRIPTION
6 Call the Create-NewProfile function directly to create a new profile
7.EXAMPLE
8 Create-NewProfile -Username 'testUser1' -Password 'testUser1'
9.NOTES
10 Created by: Josh Rickard (@MS_dministrator) and Thom Schumacher (@driberif)
11 Forked by: @crshnbrn66, then @pjh (2018-11-08). See
12 https://gist.github.com/pjh/9753cd14400f4e3d4567f4553ba75f1d/revisions
13 Date: 24MAR2017
14 Location: https://gist.github.com/crshnbrn66/7e81bf20408c05ddb2b4fdf4498477d8
15
16 Contact: https://github.com/MSAdministrator
17 MSAdministrator.com
18 https://github.com/crshnbrn66
19 powershellposse.com
20#>
21
22# IMPORTANT PLEASE NOTE:
23# Any time the file structure in the `windows` directory changes, `windows/BUILD`
24# and `k8s.io/release/lib/releaselib.sh` must be manually updated with the changes.
25# We HIGHLY recommend not changing the file structure, because consumers of
26# Kubernetes releases depend on the release structure remaining stable.
27
28
29#Function to create the new local user first
30function New-LocalUser
31{
32 [CmdletBinding()]
33 [Alias()]
34 [OutputType([int])]
35 Param
36 (
37 # Param1 help description
38 [Parameter(Mandatory=$true,
39 ValueFromPipelineByPropertyName=$true,
40 Position=0)]
41 $userName,
42 # Param2 help description
43 [string]
44 $password
45 )
46
47 $system = [ADSI]"WinNT://$env:COMPUTERNAME";
48 $user = $system.Create("user",$userName);
49 $user.SetPassword($password);
50 $user.SetInfo();
51
52 $flag=$user.UserFlags.value -bor 0x10000;
53 $user.put("userflags",$flag);
54 $user.SetInfo();
55
56 $group = [ADSI]("WinNT://$env:COMPUTERNAME/Users");
57 $group.PSBase.Invoke("Add", $user.PSBase.Path);
58}
59
60#function to register a native method
61function Register-NativeMethod
62{
63 [CmdletBinding()]
64 [Alias()]
65 [OutputType([int])]
66 Param
67 (
68 # Param1 help description
69 [Parameter(Mandatory=$true,
70 ValueFromPipelineByPropertyName=$true,
71 Position=0)]
72 [string]$dll,
73
74 # Param2 help description
75 [Parameter(Mandatory=$true,
76 ValueFromPipelineByPropertyName=$true,
77 Position=1)]
78 [string]
79 $methodSignature
80 )
81
82 $script:nativeMethods += [PSCustomObject]@{ Dll = $dll; Signature = $methodSignature; }
83}
84function Get-Win32LastError
85{
86 [CmdletBinding()]
87 [Alias()]
88 [OutputType([int])]
89 Param($typeName = 'LastError')
90 if (-not ([System.Management.Automation.PSTypeName]$typeName).Type)
91 {
92 $lasterrorCode = $script:lasterror | ForEach-Object{
93 '[DllImport("kernel32.dll", SetLastError = true)]
94 public static extern uint GetLastError();'
95 }
96 Add-Type @"
97 using System;
98 using System.Text;
99 using System.Runtime.InteropServices;
100 public static class $typeName {
101 $lasterrorCode
102 }
103"@
104 }
105}
106#function to add native method
107function Add-NativeMethods
108{
109 [CmdletBinding()]
110 [Alias()]
111 [OutputType([int])]
112 Param($typeName = 'NativeMethods')
113
114 $nativeMethodsCode = $script:nativeMethods | ForEach-Object { "
115 [DllImport(`"$($_.Dll)`")]
116 public static extern $($_.Signature);
117 " }
118
119 Add-Type @"
120 using System;
121 using System.Text;
122 using System.Runtime.InteropServices;
123 public static class $typeName {
124 $nativeMethodsCode
125 }
126"@
127}
128
129#Main function to create the new user profile
130function Create-NewProfile {
131
132 [CmdletBinding()]
133 [Alias()]
134 [OutputType([int])]
135 Param
136 (
137 # Param1 help description
138 [Parameter(Mandatory=$true,
139 ValueFromPipelineByPropertyName=$true,
140 Position=0)]
141 [string]$UserName,
142
143 # Param2 help description
144 [Parameter(Mandatory=$true,
145 ValueFromPipelineByPropertyName=$true,
146 Position=1)]
147 [string]
148 $Password
149 )
150
151 Write-Verbose "Creating local user $Username";
152
153 try
154 {
155 New-LocalUser -username $UserName -password $Password;
156 }
157 catch
158 {
159 Write-Error $_.Exception.Message;
160 break;
161 }
162 $methodName = 'UserEnvCP'
163 $script:nativeMethods = @();
164
165 if (-not ([System.Management.Automation.PSTypeName]$MethodName).Type)
166 {
167 Register-NativeMethod "userenv.dll" "int CreateProfile([MarshalAs(UnmanagedType.LPWStr)] string pszUserSid,`
168 [MarshalAs(UnmanagedType.LPWStr)] string pszUserName,`
169 [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath)";
170
171 Add-NativeMethods -typeName $MethodName;
172 }
173
174 $localUser = New-Object System.Security.Principal.NTAccount("$UserName");
175 $userSID = $localUser.Translate([System.Security.Principal.SecurityIdentifier]);
176 $sb = new-object System.Text.StringBuilder(260);
177 $pathLen = $sb.Capacity;
178
179 Write-Verbose "Creating user profile for $Username";
180
181 try
182 {
183 [UserEnvCP]::CreateProfile($userSID.Value, $Username, $sb, $pathLen) | Out-Null;
184 }
185 catch
186 {
187 Write-Error $_.Exception.Message;
188 break;
189 }
190}
191
192function New-ProfileFromSID {
193
194 [CmdletBinding()]
195 [Alias()]
196 [OutputType([int])]
197 Param
198 (
199 # Param1 help description
200 [Parameter(Mandatory=$true,
201 ValueFromPipelineByPropertyName=$true,
202 Position=0)]
203 [string]$UserName,
204 [string]$domain = 'PHCORP'
205 )
206 $methodname = 'UserEnvCP2'
207 $script:nativeMethods = @();
208
209 if (-not ([System.Management.Automation.PSTypeName]$methodname).Type)
210 {
211 Register-NativeMethod "userenv.dll" "int CreateProfile([MarshalAs(UnmanagedType.LPWStr)] string pszUserSid,`
212 [MarshalAs(UnmanagedType.LPWStr)] string pszUserName,`
213 [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath)";
214
215 Add-NativeMethods -typeName $methodname;
216 }
217
218 $sb = new-object System.Text.StringBuilder(260);
219 $pathLen = $sb.Capacity;
220
221 Write-Verbose "Creating user profile for $Username";
222 #$SID= ((get-aduser -id $UserName -ErrorAction Stop).sid.value)
223 if($domain)
224 {
225 $objUser = New-Object System.Security.Principal.NTAccount($domain, $UserName)
226 $strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
227 $SID = $strSID.Value
228 }
229 else
230 {
231 $objUser = New-Object System.Security.Principal.NTAccount($UserName)
232 $strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
233 $SID = $strSID.Value
234 }
235 Write-Verbose "$UserName SID: $SID"
236 try
237 {
238 $result = [UserEnvCP2]::CreateProfile($SID, $Username, $sb, $pathLen)
239 if($result -eq '-2147024713')
240 {
241 $status = "$userName already exists"
242 write-verbose "$username Creation Result: $result"
243 }
244 elseif($result -eq '-2147024809')
245 {
246 $staus = "$username Not Found"
247 write-verbose "$username creation result: $result"
248 }
249 elseif($result -eq 0)
250 {
251 $status = "$username Profile has been created"
252 write-verbose "$username Creation Result: $result"
253 }
254 else
255 {
256 $status = "$UserName unknown return result: $result"
257 }
258 }
259 catch
260 {
261 Write-Error $_.Exception.Message;
262 break;
263 }
264 $status
265}
266Function Remove-Profile {
267
268 [CmdletBinding()]
269 [Alias()]
270 [OutputType([int])]
271 Param
272 (
273 # Param1 help description
274 [Parameter(Mandatory=$true,
275 ValueFromPipelineByPropertyName=$true,
276 Position=0)]
277 [string]$UserName,
278 [string]$ProfilePath,
279 [string]$domain = 'PHCORP'
280 )
281 $methodname = 'userenvDP'
282 $script:nativeMethods = @();
283
284 if (-not ([System.Management.Automation.PSTypeName]"$methodname.profile").Type)
285 {
286 add-type @"
287using System.Runtime.InteropServices;
288
289namespace $typename
290{
291 public static class UserEnv
292 {
293 [DllImport("userenv.dll", CharSet = CharSet.Unicode, ExactSpelling = false, SetLastError = true)]
294 public static extern bool DeleteProfile(string sidString, string profilePath, string computerName);
295
296 [DllImport("kernel32.dll")]
297 public static extern uint GetLastError();
298 }
299
300 public static class Profile
301 {
302 public static uint Delete(string sidString)
303 { //Profile path and computer name are optional
304 if (!UserEnv.DeleteProfile(sidString, null, null))
305 {
306 return UserEnv.GetLastError();
307 }
308
309 return 0;
310 }
311 }
312}
313"@
314 }
315
316 #$SID= ((get-aduser -id $UserName -ErrorAction Stop).sid.value)
317 if($domain)
318 {
319 $objUser = New-Object System.Security.Principal.NTAccount($domain, $UserName)
320 $strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
321 $SID = $strSID.Value
322 }
323 else
324 {
325 $objUser = New-Object System.Security.Principal.NTAccount($UserName)
326 $strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
327 $SID = $strSID.Value
328 }
329 Write-Verbose "$UserName SID: $SID"
330 try
331 {
332 #http://stackoverflow.com/questions/31949002/c-sharp-delete-user-profile
333 $result = [userenvDP.Profile]::Delete($SID)
334 }
335 catch
336 {
337 Write-Error $_.Exception.Message;
338 break;
339 }
340 $LastError
341}
342
343Export-ModuleMember Create-NewProfile
View as plain text