Score:0

จะค้นหาสมาชิกทั้งหมดของ Windows Security Group ใน PowerShell กำหนดให้กับชื่อตัวแปรและส่งออกไปยัง CSV ได้อย่างไร

ธง za

ฉันไม่ใช่คนที่ดูแลระบบ sysAdmin/PowerShell แต่ฉันมีปัญหาในการทำให้คิวรี Powershell นี้ทำงาน

ความจำเป็นคือการดึงผู้ใช้ทั้งหมดในกลุ่มความปลอดภัย Windows เฉพาะกลับมา และจัดรูปแบบด้วยวิธีเฉพาะ (แสดงด้านล่าง) อย่างไรก็ตาม ฉันมีปัญหาบางอย่างในการระบุว่าเหตุใดตัวกรองของฉันสำหรับกลุ่มความปลอดภัยจึงไม่ทำงาน และสงสัยว่ามีบางอย่างผิดปกติกับวิธีที่ฉันทำ มีการตั้งค่าตัวกรอง

#ตัวอย่าง
$searcher.filter = "(&(memberof=CN=My Windows Security Group,OU=SecurityGroups,OU=Messaging,OU=Enterprise,DC=****,DC=****)(objectCategory=*)) "
$results = $searcher.findall()

ฉันตั้งค่าเบรกพอยต์ใน PowerShell ISE แล้ว แต่ $results ไม่มีค่าใดๆ ในขณะทำการดีบัก

ฉันจำลองสิ่งนี้จากสคริปต์ที่มีอยู่จากเพื่อนร่วมงาน ซึ่งดูเหมือนว่าเขากำลังสอบถาม DL และเห็นค่า $results เมื่อดีบักสิ่งนี้:

#--------------------------------------------- --------
ตัวอย่างตัวกรอง #DL (ใช้งานได้)
#--------------------------------------------- --------
$Searcher.Filter = "(&(memberOf=CN=DL_TestApp_Admin,OU=รายชื่อการแจกจ่าย,OU=ข้อความ,OU=Enterprise,DC=dcInfo,DC=dcInfo,DC=****)(objectCategory=*))"
$results = $searcher.findall()

นี่คือสคริปต์ PS ทั้งหมด (แก้ไขโดยฉัน) ที่กรอง Windows Security Groups

$curdate = (รับวันที่).ToString("MMddyyyy")

$baseDN = "LDAP://"
$Searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.searchroot = new-object system.directoryservices.directoryentry($based)
#--------------------------------------------- --------
#ตัวกรองกลุ่มความปลอดภัยของ Windows (ไม่ทำงาน)
#--------------------------------------------- --------
$searcher.filter = "(&(memberof=CN=My Windows Security Group,OU=SecurityGroups,OU=Messaging,OU=Enterprise,DC=****,DC=****)(objectCategory=*)) "
$results = $searcher.findall()

    #--------------------------------------------- --------
    #สร้างชุดข้อมูลในรูปแบบเฉพาะ
    #--------------------------------------------- --------
    $usercsv = $ผลลัพธ์ | #-วัตถุ {
         ใหม่วัตถุ -TypeName PSObject -Property @{
            "รหัสผู้ใช้" = $_.properties['samAccountName'][0]
            "บทบาทของผู้ใช้" = "บลา"
            "บทบาทที่สูงขึ้น" = "Y"
            "ผู้ใช้ภายใน" = "Y"
            "วันที่เข้าสู่ระบบครั้งล่าสุด" = $null
            "ข้อมูลเฉพาะแอป 1" = $null
            "ข้อมูลเฉพาะแอป 2" = $null
            "วันที่สร้างบัญชี" = $null
            "วันที่เปลี่ยนรหัสผ่านล่าสุด" = $null
            "ที่อยู่อีเมลของผู้ใช้" = $_.properties['mail'][0]
            "ชื่อผู้ใช้" = $null
            "ชื่อผู้ใช้" = $null
            "ข้อมูลเฉพาะแอป 3" = $null
            "กลุ่มตรวจสอบ" = $null
        }
    }

#ส่งออกเป็นcsv
$usercsv | Select-Object -Property "User ID","User Role","Elevated Role","Internal User","Date of Last Login","App Specifications 1","App Specific Info 2","Account Create Date ","วันที่เปลี่ยนรหัสผ่านล่าสุด","ที่อยู่อีเมลผู้ใช้","ชื่อผู้ใช้","นามสกุลผู้ใช้","ข้อมูลเฉพาะแอป 3","กลุ่มรีวิว" | ส่งออก Csv -NoTypeInformation -เส้นทาง "UsersListing_$curdate.csv"

โฮสต์เขียน "เขียน", $results.Count, "บันทึก"

#ลบ CR LF สุดท้าย
#TODO: ย้ายสิ่งนี้ไปยังฟังก์ชันทั่วไปในสคริปต์แยกต่างหากสำหรับทุกคน     
สคริปต์ที่จะโทร
$stream = [IO.File]::OpenWrite("UsersListing_$curdate.csv")
$stream.SetLength($stream.Length - 2)
$สตรีม.ปิด()
$stream.Dispose()

เดิมทีฉันได้เขียนสิ่งนี้เพื่อทำงานในท่อปล่อย DevOps Poweshell ดังต่อไปนี้เพื่อสร้างไฟล์ csv:

$Members = Get-ADGroup -Filter {ชื่อ -eq "WSG"} -คุณสมบัติสมาชิก | 
เลือกวัตถุ - ขยายคุณสมบัติสมาชิก

$GlobalCatalog = "$((Get-ADDomainController -Discover).Name):xxxx"

$output = Foreach ($User ใน $Members)
{
  Get-ADUSer -Identity $User -เซิร์ฟเวอร์ $GlobalCatalog -Properties CN,    
  ที่อยู่อีเมล, วันหมดอายุของบัญชี, สร้างแล้ว, หน้าแรก, วันที่เข้าสู่ระบบล่าสุด, 
  PasswordLastSet เมื่อสร้าง | เลือกวัตถุ CN, 
  SamAccountName, EmailAddress, AccountExpirationDate, สร้าง, เปิดใช้งาน,     
  หน้าแรก, LastLogonDate, ชื่อ, PasswordLastSet, UserPrincipalName, 
  เมื่อสร้าง 
}

#output ไฟล์ csv
$เอาท์พุท | ส่งออก Csv $Env:TEMP\Users.csv -NoTypeInformation

ในกรณีนี้ รูปแบบผลลัพธ์ไม่สำคัญ และฉันไม่แน่ใจว่าฉันสามารถแก้ไขข้อความค้นหานี้เพื่อแสดงผลลัพธ์ในรูปแบบนี้ได้หรือไม่:

            "รหัสผู้ใช้" = $_.properties['samAccountName'][0]
            "บทบาทของผู้ใช้" = "บลา"
            "บทบาทที่สูงขึ้น" = "Y"
            "ผู้ใช้ภายใน" = "Y"
            "วันที่เข้าสู่ระบบครั้งล่าสุด" = $null
            "ข้อมูลเฉพาะแอป 1" = $null
            "ข้อมูลเฉพาะแอป 2" = $null
            "วันที่สร้างบัญชี" = $null
            "วันที่เปลี่ยนรหัสผ่านล่าสุด" = $null
            "ที่อยู่อีเมลของผู้ใช้" = $_.properties['mail'][0]
            "ชื่อผู้ใช้" = $null
            "ชื่อผู้ใช้" = $null
            "ข้อมูลเฉพาะแอป 3" = $null
            "กลุ่มตรวจสอบ" = $null

และผลลัพธ์จากแบบสอบถามนี้อยู่ในรูปแบบเฉพาะนี้:

CN : 
Samบัญชีชื่อ : 
ที่อยู่อีเมล          : 
วันหมดอายุของบัญชี : 
สร้าง               : 
เปิดใช้งาน: 
หน้าแรก : 
วันที่เข้าสู่ระบบล่าสุด : 
ชื่อ                  : 
รหัสผ่านชุดสุดท้าย : 
UserPrincipalName : 
เมื่อสร้าง: 

ขอขอบคุณล่วงหน้าสำหรับความช่วยเหลือใดๆ

Score:2
ธง ng

ไม่จำเป็นต้องกังวลกับการค้นหา LDAP จริงตั้งแต่ โมดูล Active Directory PowerShell ได้รับการแนะนำใน Windows Server 2008 R2

รับ-ADGroupMember คือสิ่งที่คุณกำลังมองหา หากคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับสมาชิกในกลุ่ม คุณสามารถใช้ รับ ADUser กับพวกเขาเพื่อให้ได้ข้อมูลที่คุณต้องการ

โมดูล AD PowerShell ได้รับการติดตั้งโดยอัตโนมัติบนตัวควบคุมโดเมนทั้งหมด แต่คุณสามารถติดตั้งบนระบบ Windows Server ใดก็ได้โดยเปิดใช้งานคุณลักษณะ Windows ที่เกี่ยวข้อง:

ติดตั้ง WindowsFeature RSAT-AD-PowerShell

คุณยังสามารถติดตั้งบนระบบไคลเอนต์ Windows โดยเป็นส่วนหนึ่งของ เครื่องมือการดูแลเซิร์ฟเวอร์ระยะไกล.

Tikhon avatar
za flag
มีตัวอย่างการใช้งานที่ฉันสามารถปฏิบัติตามได้หรือไม่?
Semicolon avatar
jo flag
@jazzBox อย่างน้อยคุณเคยดู man page ที่เชื่อมโยงหรือไม่?
Score:1
ธง za

นี่คือ Poweshell สุดท้ายที่พัฒนาขึ้นเพื่อให้ได้ผลลัพธ์ตามที่เราต้องการ:

$curdate = (รับวันที่).ToString("MMddyyyy")
#--------------------------------------------- ------------------------------
# รับสมาชิกสำหรับ Windows Security Groups
#--------------------------------------------- ------------------------------
$Members = Get-ADGroup -Filter {ชื่อ -eq "My AD Group"} -คุณสมบัติสมาชิก | เลือกวัตถุ - ขยายคุณสมบัติสมาชิก

$GlobalCatalog = "$((Get-ADDomainController -Discover).Name):1234"
ผลลัพธ์ $ = @()

Foreach ($User ใน $Members)
{    
    $userInfo = Get-ADUSer -Identity $User -Server $GlobalCatalog -Properties SamAccountName, EmailAddress, LastLogonDate
    $details = [สั่งซื้อ] @{
        
        "รหัสไดเรกทอรีที่ใช้งานอยู่" = $userInfo.SamAccountName
        "บทบาทของผู้ใช้" = "กลุ่มโฆษณาของฉัน"
        "บทบาทขั้นสูง" = "N"
        "ผู้ใช้ภายใน" = "Y"
        "วันที่เข้าสู่ระบบล่าสุด" = $userInfo.LastLogonDate
        "ข้อมูลเฉพาะแอปพลิเคชัน 1" = $null
        "ข้อมูลเฉพาะแอปพลิเคชัน 2" = $null
        "วันที่สร้างบัญชี" = $null
        "วันที่เปลี่ยน PWD ล่าสุด" = $null
        "ที่อยู่อีเมลของผู้ใช้" = $userInfo.EmailAddress
        "ชื่อผู้ใช้" = $null
        "ชื่อผู้ใช้" = $null
        "ข้อมูลเฉพาะแอปพลิเคชัน 3" = $null
        "กลุ่มตรวจสอบ" = $null

    }
    $results = New-Object PSObject -Property $รายละเอียด
}
#--------------------------------------------- --------
#ส่งออกผลลัพธ์เป็น csv
#--------------------------------------------- --------
ผลลัพธ์ $ | ส่งออก Csv -NoTypeInformation -เส้นทาง "UsersListing_$curdate.csv"

ชื่อตัวแปร (Active Directory ID, User Role, ฯลฯ) แสดงถึงส่วนหัวของคอลัมน์ในไฟล์ CSV

หวังว่ามันจะช่วยใครสักคน

Score:0
ธง cn

คุณต้องระบุ DN ฐาน โดยปกติจะเป็น DN รูทของโดเมน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา