2009-06-09 13 views
10

वहाँ powershell का उपयोग कर सभी स्थानीय विंडोज समूह है कि एक मशीन और उन है कि उन समूहों का हिस्सा हैं पर सक्रिय हैं दिखाने के लिए एक आसान तरीका है? इस प्रश्न का दूसरा भाग एक समय में एक से अधिक मशीनों को देखने के लिए बढ़ाया जा सकता है।पावरहेल का उपयोग कर उपयोगकर्ता और स्थानीय समूह रिपोर्ट?

उत्तर

13

तथ्य आप ADSI प्रकार शॉर्टकट और WinNT उपनाम के साथ कर सकते हैं। यहाँ अपने खुद के मशीन से समूहों और सदस्यों को सूचीबद्ध करने के एक उदाहरण है:

$server="." 
$computer = [ADSI]"WinNT://$server,computer" 

$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach { 
    write-host $_.name 
    write-host "------" 
    $group =[ADSI]$_.psbase.Path 
    $group.psbase.Invoke("Members") | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 
    write-host 
} 
+0

मैं [ADSI] $ बयान $ समूह के साथ एक त्रुटि हो रही है = _। पथ पथ के सामने psbase जोड़ने – msvcyc

+0

(अर्थात [ADSI] $ _। Psbase.Path) –

+0

OMG धन्यवाद मैं इस अपने आप को कभी नहीं मिली होता! क्या यह जानने का कोई तरीका है कि स्थानीय समूह के सदस्य उपयोगकर्ता या समूह हैं या नहीं? (I localgroup प्रशासकों के सदस्यों की सूची बनाना चाहते हैं और यदि एक सदस्य एक domaingroup सूची अपने सदस्यों है) –

7

Powershell इस तरह के एक सुविधा के लिए किसी भी निहित समर्थन नहीं है। हालांकि कुछ पावरहेल कार्यों के साथ "नेट लोकल ग्रुप" कमांड को लपेटना आसान है और इस प्रकार इसे पाइपलाइन में सक्षम बनाता है।

स्थानीय समूह

function Get-LocalGroups() { 
    net localgroup | ?{ $_ -match "^\*.*" } | %{ $_.SubString(1) }; 
} 

जाओ स्थानीय समूह के सदस्यों को प्राप्त

function Get-LocalGroupMembers() { 
    param ([string]$groupName = $(throw "Need a name")) 
    $lines = net localgroup $groupName 
    $found = $false 
    for ($i = 0; $i -lt $lines.Length; $i++) { 
    if ($found) { 
     if (-not $lines[$i].StartsWith("The command completed")) { 
     $lines[$i] 
     } 
    } elseif ($lines[$i] -match "^----") { 
     $found = $true; 
    } 
    } 
} 
+0

लूप को एक बार तोड़ना चाहिए "आदेश पूरा हो गया" पंक्ति को हिट करता है, अन्यथा यह सरणी के अंतिम तत्व के रूप में एक खाली स्ट्रिंग वापस कर देगा क्योंकि आउटपुट में अंतिम पंक्ति खाली है। – bradvido

0

नीचे जो जो SIDs हल नहीं किया जा सकता है "अनाथ" खातों के साथ स्थानीय समूहों के लिए काम करता शे लेवी की पटकथा के एक उन्नत संस्करण है।

$server = "$env:COMPUTERNAME" 
$computer = [ADSI]"WinNT://$server,computer" 

$computer.psbase.children | where { $_.psbase.schemaClassName -eq 'group' } | foreach { 
    write-host $_.name 
    write-host "------" 
    $group =[ADSI]$_.psbase.Path 
    $group.psbase.Invoke("Members") | foreach {$_."GetType".Invoke().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 
    write-host 
} 
1

जे लेवी का जवाब एक समारोह :)

Function Get-LocalGroupMembers 
{ 
    Param(
     [string] 
     $server = "." 
    ) 
    Try 
    { 
     $computer = [ADSI]"WinNT://$($Server),computer" 
     $computer.psbase.children | 
      where { 
       $_.psbase.schemaClassName -eq 'group' 
      } | 
       ForEach { 
        $GroupName = $_.Name.ToString() 
        $group =[ADSI]$_.psbase.Path 
        $group.psbase.Invoke("Members") | 
         foreach { 
          $memberName = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) -replace "WinNT:", "" 

          $props = @{ 
           "LocalGroup" = $GroupName 
           "MemberName" = $memberName 
          } 

          $obj = New-Object -TypeName psobject -Property $props 
          Write-Output $obj 
         } # foreach members 
       } # foreach group 
    } 
    Catch 
    { 
     Throw 
    } 
} 

में बदल गया स्थानीय समूह के सदस्यों को प्राप्त करने के लिए

Get-LocalGroupMembers 

एक और मशीन

Get-LocalGroupMembers -Server $Computer 
के लिए स्थानीय समूह के सदस्यों को प्राप्त करने के लिए
+0

परिणाम को टेक्स्ट या सीएसवी फ़ाइल में आउटपुट करने के लिए मैं इस फ़ंक्शन को कैसे संपादित करूं? – salvationishere

संबंधित मुद्दे