別のローカルユーザーのホームディレクトリを取得する

別のローカルユーザーのホームディレクトリを取得する

あるユーザーアカウントから別のユーザーアカウントへのプロファイルデータのコピーを自動化しようとしています。この別のユーザーアカウントは、管理者アカウントから PowerShell スクリプトで作成されています。テンプレートをコピーしています。

このスクリプトは、Windows 8 マシンで実行されます。USERPROFILE は [HomeDrive]\Users[AccountName]\ であると想定できると思いましたが、実際には [HomeDrive]\Users[AccountName].[MachineName] であるケースに遭遇しました。

ユーザーアカウントを作成するために次のスニペットを使用しています。

function CreateLocalUser([string] $userName, [string] $password, [string] $description)
{
    $computer = "localhost"

    $objOu = [ADSI]"WinNT://$computer"
    $objUser = $objOU.Create("User", $userName)

    $objUser.SetPassword($password)
    $objUser.SetInfo()

    $objUser.Description = $description
    $objUser.SetInfo()

    return $objUser
}

Powershell 拡張機能を使用せずに、作成されたユーザーのホーム ディレクトリを取得するにはどうすればよいですか?

答え1

あいまいさを排除するために、コピーするユーザーのプロファイル フォルダーの reg キーを検索します。

HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\[Users SID]\Profile Image Path

ホームディレクトリの作成は難しい部分です。完全に新しいユーザーの場合は、試すMicrosoftのUSMTツール、具体的にはロードステートexe を実行し、その方法でアカウントを作成します。私はこの方法を使用したことはありませんが、最初の試みとしては、あるコンピューターにプロファイルを作成し、それを scanstate でバックアップします。次に、loadstate を使用して任意のマシンに展開し、新しいアカウント名をパラメーターとして指定します。

loadstate は、ユーザーのプロファイル (ファイルのコピー先のプロファイル フォルダーを含む) を自動的に作成し、バックアップされたファイルを復元します (空または新しいプロファイルをバックアップする場合は最小限で済みます)。ただし、重要なのは、プロファイル フォルダーが作成されることです。

USMT は MS からダウンロードでき、Windows 8 ADK にも付属しています。

答え2

プロファイル フォルダーを初期化するには、新しいユーザーとしてコマンドを実行するだけです。ユーザーのプロファイル フォルダー パスを返す関数を作成しました。

function New-UserProfileFolder ([string] $username, [string] $password) {

    $sec_password = ConvertTo-SecureString $password -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $sec_password

    # Run command to create profile folder
    Start-Process cmd /c -WindowStyle Hidden -Wait -Credential $credential -ErrorAction SilentlyContinue

    # Get information from WMI
    $user = Get-WmiObject -Namespace root/cimv2 -Class win32_useraccount -Filter "LocalAccount=True AND Name='$username'"
    $userprofile = Get-WmiObject -Namespace root/cimv2 -Class win32_userprofile -Filter "SID='$($user.sid)'"

    $userprofile.localpath
}

関連情報