Làm cách nào để lập trình khiến hồ sơ người dùng Windows mới được tạo?


20

Tôi đang tạo một người dùng (cục bộ) để dịch vụ Windows chạy. Tôi có lý do chính đáng cho việc không muốn sử dụng DỊCH VỤ MẠNG, DỊCH VỤ ĐỊA PHƯƠNG hoặc HỆ THỐNG ĐỊA PHƯƠNG.

Tôi tạo người dùng thông qua net user foobar "Abcd123!" /add- điều này hoạt động tốt.

Tại thời điểm này, c:\users\foobarkhông tồn tại.

Nếu tôi tạo thư mục chính của người dùng, trước khi người dùng đăng nhập (hoặc, thường xuyên hơn) hoặc dịch vụ mà người dùng sẽ khởi động, Windows sẽ tạo một hồ sơ người dùng bên cạnh c:\users\foobar-{gibberish/SID/whatever}- đây không phải là tên có thể dự đoán được.

Tôi cần thư mục chính của người dùng để chứa những thứ như .sshthư mục, một .gitconfig- công cụ như thế (không giới hạn ở những công cụ đó) đưa ra giả định rằng đó sẽ là một người sử dụng chúng và vì vậy cấu hình người dùng sẽ vào bên trong ~/.... Thông thường, các công cụ từ một di sản Unix.

Câu hỏi thực tế

Vậy - có cách lập trình (tốt nhất là PowerShell hoặc dòng lệnh ngoài luồng) để báo cho Windows tạo hồ sơ người dùng cho người dùng cục bộ không?

Hoặc, bất kỳ cách giải quyết khác?

Những điều tôi chưa thử:

  • NSSM start / pre hook sao chép các tệp từ nơi khác vào thư mục hồ sơ người dùng hy vọng tồn tại vào thời điểm này nhờ Windows khởi động dịch vụ, tạo hồ sơ người dùng sau đó trao quyền điều khiển cho trình bao bọc NSSM chạy hook trước khi khởi động.
  • Đặt biến môi trường USERPROFILE cho dịch vụ ở một nơi khác ngoài thư mục hồ sơ người dùng thực tế. Điều này gây ấn tượng mạnh với tôi như là piste nguy hiểm nhưng cũng có thể hoạt động tốt.

Bối cảnh khác:

  • Windows Server 2016, trải nghiệm máy tính để bàn.
    • Không thể sử dụng Core / Nano.
  • Không có thư mục hoạt động trong chơi. Sẽ không có.
  • Đây là những người dùng địa phương.
  • Tôi đang thực hiện việc này thông qua Ansible, công ty đang sử dụng PowerShell trong phần mềm dành cho Windows. Cụ thể là mô-đun win_user , với Ansible 2.7.5.
  • Tôi không muốn tạo C:\users\default(tương đương /etc/skel), vì có một vài người dùng dịch vụ khác nhau và một kích thước sẽ không phù hợp với tất cả. Điều này cũng không ảnh hưởng khi hồ sơ người dùng được tạo, chỉ những gì sẽ có trong đó khi có.
  • Tôi đang sử dụng NSSM để quản lý các dịch vụ.

Những điều tôi đã thử

  • bắt đầu dịch vụ và cho phép Windows tạo thư mục
    • Tôi không muốn làm điều này, vì dịch vụ yêu cầu bí mật trước khi khởi động, và vì vậy nếu tôi làm điều này trong quy trình nướng hình ảnh của mình thì tôi sẽ cần phải dọn sạch chúng, và cũng đảm bảo dịch vụ của tôi không làm bất kỳ công việc trong giai đoạn nướng. Tôi muốn tránh cả hai bit khó khăn đó.

1
Bạn đã kiểm tra các tùy chọn net usercó (ví dụ /HOMEDIRhoặc /PROFILEPATH)? . Xem net user /help. Từ sự hiểu biết (chưa được kiểm tra) của tôi, bạn có thể tạo một thư mục cho người dùng và đặt thư mục này là homedir với công /HOMEDIRtắc.
Sven

Tôi có thể hỏi trường hợp sử dụng nào để tránh Active Directory không? Mọi thứ sẽ dễ dàng hơn nhiều với AD. Chỉ tò mò thôi.
Ondrej Túcny 28/12/18

Tôi đang tránh AD vì máy móc phù du; tuổi thọ được đo bằng giờ, không phải ngày. Các máy đang lưu trữ môi trường xây dựng phòng sạch. Việc tung các máy vào và ra khỏi một AD khi chúng đến và đi chỉ đơn giản là không có giá trị (xem thêm Medium.com/palantir/active-directory-as-code-e9666a2e548d nếu bạn muốn làm điều đó).
Peter Mounce

@ Đã có - thật đáng buồn khi cả hai đều không tạo ra hồ sơ, ngay cả khi họ đặt đường dẫn.
Peter Mounce

Câu trả lời:


23

Windows có thể tạo hồ sơ người dùng theo yêu cầu, sử dụng API CreatProfile

Tuy nhiên, nếu không muốn tạo một tệp thực thi để thực hiện thao tác này, bạn có thể gọi API trong PowerShell. Những người khác đã làm điều đó: ví dụ trên github .

Phần có liên quan của mã:

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

Cảm ơn bạn rất nhiều, điều này làm việc cho tôi. Lưu ý cho những người khác - các chức năng Đăng ký-NativeMethod và Add-NativeMethods nằm trong ý chính được liên kết.
Peter Mounce

17

Tất cả những gì bạn cần làm là chạy một lệnh vì người dùng đó, Windows sẽ tạo hồ sơ:

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

https://docs.microsoft.com/en-us/sysiternals/doads/psexec


1
Vì vậy, những gì đang xảy ra ở đây là psexec phải kết nối với localhost dưới tên người dùng và mật khẩu chỉ định với -u-pvà khởi động cmdchỉ để thoát ngay lập tức. Tôi có bỏ lỡ điều gì không? Điều này nghe có vẻ trái ngược - kết nối với hệ thống với tên người dùng và mật khẩu không tồn tại sẽ là một lỗi. Làm thế nào mà làm việc?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: Tại sao bạn nghĩ rằng đó là tên người dùng và mật khẩu không tồn tại? Đó là cùng một câu hỏi được sử dụng trong câu hỏi, rõ ràng là một ví dụ ...
Ben Voigt

1
@BenVoigt Chà, tôi đã bỏ lỡ phần đầu của câu hỏi. Tôi nghĩ OP cũng muốn tạo ra người dùng và đó là những gì câu trả lời này phải làm. Vì vậy, phần cuối cùng của bình luận là một sự hiểu lầm.
Sergiy Kolodyazhnyy

@BenVoigt Mặc dù tôi vẫn có một câu hỏi. OP đã đề cập "Tôi không muốn tạo C: \ users \ default". Vậy hồ sơ của người dùng sẽ đến từ đâu khi phương pháp này được sử dụng và làm thế nào Windows biết để tạo các thư mục được cấu hình sẵn cụ thể nếu không phải từ C:\users\defaultsđâu?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: Khá chắc chắn OP có nghĩa là anh ta không muốn tùy chỉnh C: \ Users \ Mặc định ... không phải là nó sẽ bị thiếu hoàn toàn. Windows sẽ tạo thư mục chính C: \ Users \ foobar bằng cách sao chép từ vanilla đơn giản C: \ Users \ mặc định, sau đó khi OP tồn tại, OP có thể áp dụng nước sốt đặc biệt của mình cho C: \ Users \ foobar nơi nó sẽ không ảnh hưởng đến bất kỳ ai khác người dùng.
Ben Voigt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.