ฉันจะสร้างโปรไฟล์ผู้ใช้ Windows ใหม่โดยทางโปรแกรมได้อย่างไร


20

ฉันกำลังสร้างผู้ใช้ (ในพื้นที่) เพื่อให้บริการ 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 ที่คัดลอกไฟล์จากที่อื่นไปยังไดเร็กทอรีโปรไฟล์ผู้ใช้ที่หวังว่าจะมีอยู่ ณ จุดนี้โดยอาศัยWindows ที่เริ่มให้บริการสร้างโปรไฟล์ผู้ใช้จากนั้นมอบการควบคุมไปยัง wrapper NSSM ที่รัน hook ก่อนเริ่มทำงาน
  • การตั้งค่าตัวแปรสภาวะแวดล้อม USERPROFILE เพื่อให้บริการอยู่ที่อื่นนอกเหนือจากไดเร็กทอรีโปรไฟล์ผู้ใช้จริง สิ่งนี้ทำให้ฉันเป็นอันตรายนอกระบบสกี แต่ก็อาจทำงานได้ดี

บริบทอื่น ๆ :

  • Windows Server 2016 ประสบการณ์เดสก์ท็อป
    • ไม่สามารถใช้คอร์ / นาโน
  • ไม่มีไดเรกทอรีที่ใช้งานอยู่ในการเล่น จะไม่มี
  • เหล่านี้คือผู้ใช้ท้องถิ่น
  • ฉันทำสิ่งนี้ผ่าน 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 ได้ไหม ทุกอย่างจะง่ายขึ้นเมื่อใช้โฆษณา แค่สงสัย.
Ondrej Tucny

ฉันกำลังหลีกเลี่ยงโฆษณาเพราะเครื่องจักรนั้นไม่สำคัญ อายุการใช้งานวัดเป็นชั่วโมงไม่ใช่วัน เครื่องจักรกำลังโฮสต์สภาพแวดล้อมการสร้างห้องสะอาด การเล่นปาหี่เครื่องเข้าและออกจากโฆษณาตามที่มาและไปก็ไม่คุ้มค่า (ดูที่medium.com/palantir/active-directory-as-code-e9666a2e548dหากคุณสนใจที่จะทำ)
Peter Mounce

@ แม้แต่ใช่ - น่าเสียดายที่ไม่ได้สร้างโปรไฟล์เองแม้ว่าจะเป็นเส้นทางก็ตาม
Peter Mounce

คำตอบ:


23

Windows สามารถสร้างโปรไฟล์ผู้ใช้แบบออนดีมานด์โดยใช้CreateProfile API

อย่างไรก็ตามหากไม่ต้องการสร้างไฟล์ปฏิบัติการเพื่อดำเนินการนี้คุณสามารถโทรหา 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 อยู่ในส่วนสำคัญที่เชื่อมโยง
Peter Mounce

17

สิ่งที่คุณต้องทำคือเรียกใช้คำสั่งในฐานะผู้ใช้นั้น Windows จะสร้างโปรไฟล์:

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

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


1
ดังนั้นสิ่งที่เกิดขึ้นที่นี่เป็นที่ psexec ควรจะเชื่อมต่อกับ localhost ภายใต้ชื่อผู้ใช้และรหัสผ่านที่ระบุไว้กับ-uและ-pและการเปิดตัวcmdเพียงเพื่อออกทันที ฉันคิดถึงอะไรเหรอ? ฟังก์ชั่นนี้ค่อนข้างใช้งานง่าย - การเชื่อมต่อกับระบบด้วยชื่อผู้ใช้และรหัสผ่านที่ไม่มีอยู่ควรเป็นข้อผิดพลาด มันทำงานอย่างไร
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: ทำไมคุณคิดว่านั่นเป็นชื่อผู้ใช้และรหัสผ่านที่ไม่มีอยู่? มันเป็นหนึ่งเดียวกับที่ใช้ในคำถามที่เห็นได้ชัดว่าเป็นตัวอย่าง ...
เบนยต์

1
@ BenVoigt ดีฉันพลาดส่วนบนของคำถาม ฉันคิดว่า OP ต้องการสร้างผู้ใช้ด้วยและนั่นคือสิ่งที่คำตอบนี้ควรทำ ดังนั้นส่วนสุดท้ายของความคิดเห็นจึงเป็นความเข้าใจผิด
Sergiy Kolodyazhnyy

@ BenVoigt แม้ว่าฉันจะยังมีคำถามอยู่ OP กล่าวถึง "ฉันไม่ต้องการสร้าง C: \ users \ default" ดังนั้นโปรไฟล์ของผู้ใช้จะมาจากไหนเมื่อใช้วิธีนี้และ Windows รู้ได้อย่างไรว่าจะสร้างไดเรกทอรีที่กำหนดค่าไว้ล่วงหน้าได้C:\users\defaultsอย่างไรถ้าไม่ใช่
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: ค่อนข้างแน่ใจว่า OP หมายความว่าเขาไม่ต้องการปรับแต่ง C: \ Users \ Default ... ไม่ใช่ว่ามันจะหายไปทั้งหมด Windows จะสร้างโฮมไดเร็กตอรี่ C: \ Users \ foobar โดยการคัดลอกจากวานิลลาธรรมดา C: \ Users \ default จากนั้นเมื่อ OP มีอยู่สามารถใช้ซอสพิเศษของเขากับ C: \ Users \ foobar ซึ่งจะไม่มีผลกระทบใด ๆ ผู้ใช้
Ben Voigt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.