新しいWindowsユーザーのプロファイルをプログラムで作成するにはどうすればよいですか?


20

Windowsサービスを実行する(ローカル)ユーザーを作成しています。NETWORK SERVICE、LOCAL SERVICE、またはLOCAL SYSTEMを使用したくない理由があります。

経由でユーザーを作成しますnet user foobar "Abcd123!" /add-これは正常に動作します。

この時点でc:\users\foobarは、存在しません。

場合、私は、ユーザーのホームディレクトリを作成し、ユーザーのいずれかのログに(または、それ以上適宜)、またはユーザーが起動するためのものであることをサービスする前に、Windowsは隣と呼ばれるユーザー・プロファイルを作成するc:\users\foobar-{gibberish/SID/whatever}-これは、予測可能な名前ではありません。

ユーザーのホームディレクトリには、.sshディレクトリのようなものを含める必要があります.gitconfig。a-そのようなツール(これらのツールに限定されない)は、それを使用する人であると仮定するため、ユーザー設定は内部にあり~/...ます。通常、Unixの遺産からのツール。

実際の質問

だから-ローカルユーザーのユーザープロファイルを作成するようにWindowsに指示するためのプログラム的な(できればPowerShellまたはすぐに使えるコマンドライン)方法はありますか?

または、他の回避策はありますか?

まだ試したことがないこと:

  • アンNSSMは/ことを、ユーザープロファイルディレクトリに別の場所からファイルをコピーすることを事前にフックを開始うまくいけばのおかげで、この時点で存在しているWindowsのサービスを開始するが、その後、起動前にフックを実行しているラッパーNSSMに渡す制御をユーザー・プロファイルを作成します。
  • サービスのUSERPROFILE環境変数を実際のユーザープロファイルディレクトリ以外の場所に設定します。これは危険なほどゲレンデから外れているように感じますが、うまくいくかもしれません。

その他のコンテキスト:

  • Windows Server 2016、デスクトップエクスペリエンス。
    • Core / Nanoは使用できません。
  • プレイ中のアクティブディレクトリはありません。ありません。
  • これらはローカルユーザーです。
  • これは、Windowsの内部でPowerShellを使用しているAnsibleを介して実行しています。具体的には、Ansible 2.7.5のwin_userモジュール。
  • C:\users\default(に相当する/etc/skel)を作成したくないのは、いくつかの異なるサービスユーザーがいて、1つのサイズではすべてに対応できないためです。これは、ユーザープロファイルが作成されるタイミングにも影響せず、作成されるときにユーザープロファイルに何が含まれるかだけに影響します。
  • NSSMを使用してサービスを管理しています。

試したこと

  • サービスを開始し、Windowsがディレクトリを作成できるようにする
    • サービスを開始する前に秘密が必要なので、これを行いたくないので、画像ベーキングプロセス内でこれを行う場合、それらをクリーンアップする必要があり、またサービスがしないことを確認する必要がありますベーキング段階での作業。私はそれらの厄介なビットの両方を避けたいです。

1
オプションnet userがあるかどうかをチェックしましたか(例:/HOMEDIRまたは/PROFILEPATH)?。をご覧くださいnet user /help。私の(テストされていない)理解から、ユーザーのディレクトリを作成し、これを/HOMEDIRスイッチでhomedirとして設定できます。
スベン

Active Directoryを回避するユースケースを教えてください。ADの方がずっと簡単です。ちょっと興味があるんだけど。
オンドレイチュニー

マシンは短命なので、ADを避けています。寿命は日ではなく時間で測定されます。マシンは、クリーンルームのビルド環境をホストしています。ADに出入りするマシンをジャグリングすることは、それだけの価値はありません(興味がある場合はmedium.com/palantir/active-directory-as-code-e9666a2e548dも参照してください)。
ピーターマンス

@Sven yes-残念ながら、パスを設定しても、どちらもプロファイル自体は作成されません。
ピーターマンス

回答:


23

Windowsは、CreateProfile API を使用して、オンデマンドでユーザープロファイルを作成できます。

ただし、この操作を実行する実行可能ファイルを作成したくない場合は、PowerShellでAPIを呼び出すことができます。他の人はすでにそれを行っています:githubの例

コードの関連部分:

$methodName = 'UserEnvCP'
$script:nativeMethods = @();

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;
}

どうもありがとう、これは私のために働く。他者への注意-Register-NativeMethodおよびAdd-NativeMethods関数はリンクされた要点にあります。
ピーターマンス

17

そのユーザーとしてコマンドを実行するだけで、Windowsがプロファイルを作成します。

psexec.exe -u foobar -p Abcd123! cmd.exe /c exit

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec


1
したがって、ここで何が起きているのかは 、andでpsexec 指定されたユーザー名とパスワードでlocalhostに接続し、すぐに終了するために起動することになっています。私は何かを見逃しましたか?これはやや直感に反するように聞こえます-存在しないユーザー名とパスワードでシステムに接続するとエラーになります。それはどのように機能しますか?-u-pcmd
セルギーKolodyazhnyy

1
@SergiyKolodyazhnyy:なぜそれが存在しないユーザー名とパスワードだと思いますか?それは...明らか例として、質問に使用されるものと同じだ
ベンフォークト

1
@BenVoigtさて、質問の一番上の部分を見逃しました。OPもユーザーを作成したいと思ったので、それがこの回答の目的でした。したがって、コメントの最後の部分は誤解です。
セルギーKolodyazhnyy

@BenVoigtまだ質問がありますが。OPは「C:\ users \ defaultを作成したくない」と述べました。したがって、この方法が使用された場合、ユーザーのプロファイルはどこから来ますか?また、Windowsが特定の事前設定されたディレクトリを作成する方法を知っていますC:\users\defaultsか?
セルギーKolodyazhnyy

1
@SergiyKolodyazhnyy:OPがC:\ Users \ Defaultをカスタマイズしたくないことを意味していることは確かです...完全に欠落しているわけではありません。Windowsは、プレーンなバニラC:\ Users \ defaultからコピーすることでホームディレクトリC:\ Users \ foobarを作成し、OPが存在すれば、他に影響を与えないC:\ Users \ foobarに特別なソースを適用できますユーザー。
ベンフォークト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.