...

Text file src/k8s.io/kubernetes/cluster/gce/windows/testonly/user-profile.psm1

Documentation: k8s.io/kubernetes/cluster/gce/windows/testonly

     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