Windowsサービスを実行するための(ローカル)ユーザーを作成しています。 NETWORK SERVICE、LOCAL SERVICE、またはLOCAL SYSTEMを使用したくない理由は十分にあります。
私はNet User foobar "Abcd123!" /add
を介してユーザーを作成します-これは正常に動作します。
この時点では、c:\users\foobar
は存在しません。
[〜#〜] i [〜#〜]がユーザーのホームディレクトリを作成する場合、ユーザーがログオンする前に(またはより適切に)またはユーザーが対象とするサービスが起動すると、Windowsはc:\users\foobar-{gibberish/SID/whatever}
というユーザープロファイルを隣に作成します-これは予測可能な名前ではありません。
ユーザーのホームディレクトリに.ssh
ディレクトリ、.gitconfig
などのツール(これらのツールに限定されない)を含める必要があります。これらのツールは、それらを使用する人であると想定し、ユーザー設定は~/...
内にあります。通常、UNIXの遺産に由来するツール。
それで、ローカルユーザーのユーザープロファイルを作成するようにWindowsに指示するプログラム的な(できればPowerShell、またはすぐに使えるコマンドライン)方法はありますか?
私がまだ試していないこと:
C:\users\default
(/etc/skel
に相当)を作成したくありません。これは、いくつかの異なるサービスユーザーがあり、1つのサイズではすべてに対応できないためです。これは、ユーザープロファイルの作成時にも影響しません。作成時に何が含まれるかだけです。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;
}
そのユーザーとしてコマンドを実行するだけで、Windowsがプロファイルを作成します。
psexec.exe -u foobar -p Abcd123! cmd.exe /c exit
https://docs.Microsoft.com/en-us/sysinternals/downloads/psexec