如何以编程方式创建新的 Windows 用户配置文件?

如何以编程方式创建新的 Windows 用户配置文件?

我正在为要运行的 Windows 服务创建一个(本地)用户。我有充分的理由不想使用网络服务、本地服务或本地系统。

我通过以下方式创建用户net user foobar "Abcd123!" /add- 这很有效。

此时,c:\users\foobar不存在。

如果创建用户的主目录,在用户登录(或更确切地说)或用户所使用的服务启动之前,Windows 会创建一个名为的用户配置文件c:\users\foobar-{gibberish/SID/whatever}- 这不是一个可预测的名称。

我需要用户的主目录包含诸如.ssh目录之类的东西,.gitconfig诸如此类的工具(不限于这些工具),它们假设会有一个用户使用它们,因此用户配置会进入其中~/...。通常,这些工具来自 Unix 传统。

实际问题

那么 - 是否有一种编程方式(最好是 PowerShell 或开箱即用的命令行)来告诉 Windows 为本地用户创建用户配置文件?

或者还有其他解决方法吗?

我还没有尝试过的事情:

  • NSSM start/pre hook 将文件从其他地方复制到用户配置文件目录中,希望此时存在视窗启动服务,创建用户配置文件,然后在启动前将控制权交给运行钩子的 NSSM 包装器。
  • 将服务的 USERPROFILE 环境变量设置为实际用户配置文件目录以外的某个位置。我觉得这很危险,但也可能没问题。

其他背景:

  • Windows Server 2016,桌面体验。
    • 无法使用 Core/Nano。
  • 目前没有活动目录在起作用。不会有。
  • 这些是本地用户。
  • 我通过 Ansible 执行此操作,它在 Windows 后台使用 PowerShell 进行操作。具体来说获胜者模块,使用 Ansible 2.7.5。
  • 我不想创建一个C:\users\default(相当于/etc/skel),因为有几个不同的服务用户,一个尺寸不适合所有人。这也不会影响用户配置文件的创建时间,只会影响创建时其中的内容。
  • 我在用着国家安全监测中心来管理服务。

我尝试过的事情

  • 启动服务并允许 Windows 创建目录
    • 我不想这样做,因为服务在启动前需要机密信息,因此如果我在图像烘焙过程中这样做,那么我需要清理它们,并确保我的服务在烘焙阶段不执行任何工作。我想避免这两个麻烦的部分。

答案1

Windows 可以根据需要创建用户配置文件,使用创建个人资料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;
}

答案2

您需要做的就是以该用户身份运行命令,Windows 将创建配置文件:

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

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

答案3

这是一个有点老的线程,但是我在寻找一种方法来在新的图像构建脚本中正确创建用户的配置文件文件夹结构时偶然发现了它,这种方法无法通过 GPO 等实现特定的自定义。

如果您使用用户凭据运行远程 powershell Invoke-Command,它将在 C:\Users 下构建用户配置文件夹(如果该文件夹尚不存在),然后您可以根据需要操作它以及 HKCU 注册表项。

此命令除了退出命令外不执行任何操作,但如果用户配置文件尚不存在,则会创建用户配置文件:

调用命令 -计算机名称 $computerVar -ScriptBlock {exit} -凭据 $credentialVar

显然,用户的凭证必须具有远程连接的权利,并且操作系统防火墙不能阻止所述连接,但除此之外,此命令至少会执行您所寻找的操作。

相关内容