Як я можу програматично створити новий профіль користувача Windows?


20

Я створюю (локального) користувача для служби Windows під керуванням. У мене є вагомі причини, коли я не хочу користуватися мережевою службою, локальним обслуговуванням або локальною системою.

Я створюю користувача через net user foobar "Abcd123!" /add- це працює чудово.

На даний момент c:\users\foobarне існує.

Якщо я створюю домашній каталог користувача, перед тим, як користувач або ввійде (або, що більш доречно), або послуга, для якої користувач запускає, Windows створює профіль користувача під назвою c:\users\foobar-{gibberish/SID/whatever}- це не передбачувана назва.

Мені потрібен домашній каталог користувача, щоб він містив такі речі, як .sshкаталог, a .gitconfig- такі інструменти (не обмежуючись цими інструментами), які роблять припущення, що це буде людина, яка ними користується, і тому конфігурація користувача проходить всередині ~/.... Зазвичай інструменти зі спадщини Unix.

Актуальне питання

Отже - чи існує програмний (бажано, PowerShell або нестандартний командний рядок) спосіб сказати Windows, щоб створити профіль користувача для місцевого користувача?

Або будь-які інші шляхи вирішення?

Що я ще повинен спробувати:

  • Запуск / попередній гачок NSSM, який копіює файли з іншого місця в каталог профілів користувача, який, сподіваємось, існує в даний момент в силу запуску служби Windows , створює профіль користувача, а потім передає керування обертці NSSM, що запускає гак перед запуском.
  • Встановлення змінної середовища USERPROFILE для служби десь іншою, ніж фактична директорія профілю користувача. Це вражає мене як небезпечно поза межами трас, але також може спрацювати чудово.

Інший контекст:

  • Windows Server 2016, досвід роботи на робочому столі.
    • Неможливо використовувати Core / Nano.
  • У грі немає активного каталогу. Не буде.
  • Це місцеві користувачі.
  • Я роблю це через Ansible, який використовує PowerShell під кришкою для речей Windows. Зокрема модуль win_user , з Ansible 2.7.5.
  • Я не хочу створювати C:\users\default(еквівалент /etc/skel), тому що є кілька різних користувачів сервісу, і один розмір підійде не всім. Це також не впливає на те, коли буде створений профіль користувача, а лише те, що буде в ньому, коли він буде.
  • Я використовую 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 так - на жаль, жоден із них не спричиняє створення самого профілю, навіть якщо вони встановлюють шлях.
Пітер Мунс

Відповіді:


23

Windows може створити профіль користувача на вимогу за допомогою API CreateProfile

Однак якщо ви не хочете створити виконуваний файл для виконання цієї операції, ви можете зателефонувати в API в PowerShell. Інші вже це зробили: приклад на 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
Так що тут відбувається як psexec передбачається підключити до локальної машині під ім'ям користувача і пароль , заданий з -uі -pі запуску cmdтільки для виходу відразу. Я щось пропустив? Це звучить дещо протизаконно - підключення до системи з неіснуючими ім'ям користувача та паролем має бути помилкою. Як це працює?
Сергій Колодяжний

1
@SergiyKolodyazhnyy: Чому ви вважаєте, що це неіснуюче ім’я користувача та пароль? Це той самий, що використовується у питанні, очевидно, як приклад ...
Бен Войгт

1
@BenVoigt Ну, я пропустив верхню частину питання. Я думав, що ОП хотів створити і користувача, і саме ця відповідь повинна була зробити. Тож остання частина коментаря - це непорозуміння.
Сергій Колодяжний

@BenVoigt Хоча у мене ще є питання. OP згадував "Я не хочу створювати C: \ users \ default". То звідки б узявся профіль користувача, коли використовується цей метод, і як Windows знає, щоб створити конкретні попередньо налаштовані каталоги, як не C:\users\defaults?
Сергій Колодяжний

1
@SergiyKolodyazhnyy: Досить впевнений, що ОП означає, що він не хоче налаштовувати C: \ Користувачі \ За замовчуванням ... не те, що він буде повністю відсутній. Windows створить домашній каталог C: \ Users \ foobar, скопіювавши з простої ванілі C: \ Users \ за замовчуванням, тоді, коли він існує, OP може застосувати свій спеціальний соус до C: \ Users \ foobar, де це не вплине на жодного іншого користувачів.
Бен Войгт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.