none
локальные пользователи powershell RRS feed

  • Вопрос

  • нужен чтоб мне отображалось не просто "user01" а показывало свойство типа "domain\user" или "localcomp\user" и если это "localcomp\user" - чем показать что она enable/disble?)

    что-то начал делать вторую часть где-то позаимствовал но не то, помогите...

    $computerName = "mycomp"
    $computer = [ADSI]"WinNT://$computerName,computer"
    $computer.psbase.children | where { $_.psbase.schemaClassName -eq ‘group’ } | foreach {
        write-host "Group:" $_.Name
        $a1 = $_.Name

    $LocalGroup =[ADSI]"WinNT://$computerName/$a1"
    $UserNames = @($LocalGroup.psbase.Invoke("Members"))
    $UserNames | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    }

Ответы

  • Я в SCCM делаю это через VBS-скрипт. В результате создается дополнительный класс WMI Win32_LocalGroupMember, который уже можно опрашивать и вести инвентаризацию по нему, чтобы класс постоянно обновлялся, то поставьте скрипт на планировщик задач, если интересно то вот код:

    ' Set variables
    
    Set oShell = CreateObject("Wscript.Shell")
    Set oWMI = GetObject("winmgmts:root\cimv2")
    cDQT = Chr(34)
    cSQT = Chr(39)
    iCimtypeString = 8
    sClassName = "Win32_LocalGroupMember"
    
    ' Exit script if computer is a Domain Controller
    
    For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
    	if (oComputer.DomainRole >= 4) then _
    	wScript.Quit
    Next
    
    ' Clear class if exists
    
    For Each oSubclass in oWMI.SubclassesOf()
    	if oSubclass.Path_.Class = sClassName then _
    		oWMI.Get(sClassName).Delete_
    Next
    
    ' Create class
    
    Set oClass = oWMI.Get()
    oClass.Path_.Class = sClassName
    oClass.Properties_.add "MemberName" , iCimtypeString
    oClass.Properties_.add "MemberDomain" , iCimtypeString
    oClass.Properties_.add "MemberType" , iCimtypeString
    oClass.Properties_.add "Name" , iCimtypeString
    oClass.Properties_.add "Domain" , iCimtypeString
    oClass.Properties_.add "SID" , iCimtypeString
    oClass.Properties_("Name").Qualifiers_.add "key" , True
    oClass.Properties_("MemberName").Qualifiers_.add "key" , True
    oClass.Put_
    
    ' Return data to class
    
    Set oClass = oWMI.Get(sClassName).SpawnInstance_
    For Each oGroup in oWMI.ExecQuery("select * from win32_group where localaccount=1")
    	For Each oGroupUser in oWMI.ExecQuery("select PartComponent from Win32_GroupUser Where GroupComponent = "_
    	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
    		sSplit = split(oGroupUser.PartComponent,cDQT)
    		Select Case (lcase(split(sSplit(0),":")(1)))
    			Case "win32_systemaccount.domain="
    				oClass.MemberType = "SystemAccount"
    			Case "win32_useraccount.domain="
    				oClass.MemberType = "UserAccount"
    			Case "win32_group.domain="
    				oClass.MemberType = "Group"
    			Case Else
    				oClass.MemberType = "Unknown"
    		End Select
    		oClass.MemberDomain = sSplit(1)
    		oClass.MemberName = sSplit(3)
    		oClass.Name = oGroup.Name
    		oClass.Domain = oGroup.Domain
    		oClass.SID = oGroup.SID
    		oClass.Put_
    	Next
    Next


    Здравствуйте bobgreen84!

    Если вам не сложно, можете описать в нескольких шагах как вы именно это реализовали через SCCM?


    http://systemcenter4all.wordpress.com/2012/06/17/local-group-membership/

    Vladimir Zelenov | http://systemcenter4all.wordpress.com

    • Помечено в качестве ответа KazunEditor 17 ноября 2012 г. 8:20
    16 ноября 2012 г. 13:16

Все ответы

  • Get-WmiObject win32_UserAccount | Format-Table Caption, Disabled -AutoSize
    или я что-то не так понял?
  • локально на компе смотреть нужно...
  • Чесгря тогда не понятно что требуется.

    Есть локальные юзвери компа, которые comp\user. Они добываются, как вариант, как указал Smearg выше.

    Есть глобальные юзвери, которые domain\user. Они добываются, к примеру, командлетом Get-ADUser.

    Что конкретно Вам требуется получить? Удалённо или локально?

  • :)

     Меня смутил в предложенном вариантеследующее

    "Note  Because both the Name and Domain are key properties, enumerating Win32_UserAccount on a large network can negatively affect performance"

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa394507%28v=vs.85%29.aspx

    он сразу мне не подходит.

    ...Есть у меня список серверов скажем 100 шт. Нужно сделать выборку всех пользователей и групп входящих в локальные группы на сервере (список групп на серверах отличается).

  • Есть локальные юзвери компа, которые comp\user. Они добываются, как вариант, как указал Smearg выше.

    Есть глобальные юзвери, которые domain\user. Они добываются, к примеру, командлетом Get-ADUser.

    Что конкретно Вам требуется получить? Удалённо или локально?

    Get-WmiObject win32_UserAccount возвращает информацию, как о локальных, так и о доменных пользователях. Отличить (и/или отфильтровать) локального пользователя от доменного можно при помощи поля LocalAccount, имеющегося у каждого объекта, возвращаемого Get-WmiObject win32_UserAccount .

    my blog: http://shserg.ru/



    • Изменено s.h.s. _ 19 мая 2012 г. 14:15
  • Все отлично, но только объектов больше 10000 и когда запустить скрипт, чтоб он парсил по очереди на каждом серваке с фильтром выше упомянутым - представьте эффективность и быстроту выполнения кода с использованием wmi, что выше было упомянуто.
  • Можно запустить одновременно на всех серверах в фоне используя параметр -AsJob.
  • Я в SCCM делаю это через VBS-скрипт. В результате создается дополнительный класс WMI Win32_LocalGroupMember, который уже можно опрашивать и вести инвентаризацию по нему, чтобы класс постоянно обновлялся, то поставьте скрипт на планировщик задач, если интересно то вот код:

    ' Set variables
    
    Set oShell = CreateObject("Wscript.Shell")
    Set oWMI = GetObject("winmgmts:root\cimv2")
    cDQT = Chr(34)
    cSQT = Chr(39)
    iCimtypeString = 8
    sClassName = "Win32_LocalGroupMember"
    
    ' Exit script if computer is a Domain Controller
    
    For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
    	if (oComputer.DomainRole >= 4) then _
    	wScript.Quit
    Next
    
    ' Clear class if exists
    
    For Each oSubclass in oWMI.SubclassesOf()
    	if oSubclass.Path_.Class = sClassName then _
    		oWMI.Get(sClassName).Delete_
    Next
    
    ' Create class
    
    Set oClass = oWMI.Get()
    oClass.Path_.Class = sClassName
    oClass.Properties_.add "MemberName" , iCimtypeString
    oClass.Properties_.add "MemberDomain" , iCimtypeString
    oClass.Properties_.add "MemberType" , iCimtypeString
    oClass.Properties_.add "Name" , iCimtypeString
    oClass.Properties_.add "Domain" , iCimtypeString
    oClass.Properties_.add "SID" , iCimtypeString
    oClass.Properties_("Name").Qualifiers_.add "key" , True
    oClass.Properties_("MemberName").Qualifiers_.add "key" , True
    oClass.Put_
    
    ' Return data to class
    
    Set oClass = oWMI.Get(sClassName).SpawnInstance_
    For Each oGroup in oWMI.ExecQuery("select * from win32_group where localaccount=1")
    	For Each oGroupUser in oWMI.ExecQuery("select PartComponent from Win32_GroupUser Where GroupComponent = "_
    	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
    		sSplit = split(oGroupUser.PartComponent,cDQT)
    		Select Case (lcase(split(sSplit(0),":")(1)))
    			Case "win32_systemaccount.domain="
    				oClass.MemberType = "SystemAccount"
    			Case "win32_useraccount.domain="
    				oClass.MemberType = "UserAccount"
    			Case "win32_group.domain="
    				oClass.MemberType = "Group"
    			Case Else
    				oClass.MemberType = "Unknown"
    		End Select
    		oClass.MemberDomain = sSplit(1)
    		oClass.MemberName = sSplit(3)
    		oClass.Name = oGroup.Name
    		oClass.Domain = oGroup.Domain
    		oClass.SID = oGroup.SID
    		oClass.Put_
    	Next
    Next


  • Еще проще сделать так:

    <....

    Код, который содержит информацию о компьютерах, возможно, просто список в txt

    Примерно так: $Computers = gc "C:\Computers.txt"

    ....>

    foreach ($Computer in $Computers) {
    gwmi -query "select * from win32_useraccount where localaccount=1" -computername $computer
    }
    

  • Я в SCCM делаю это через VBS-скрипт. В результате создается дополнительный класс WMI Win32_LocalGroupMember, который уже можно опрашивать и вести инвентаризацию по нему, чтобы класс постоянно обновлялся, то поставьте скрипт на планировщик задач, если интересно то вот код:

    ' Set variables
    
    Set oShell = CreateObject("Wscript.Shell")
    Set oWMI = GetObject("winmgmts:root\cimv2")
    cDQT = Chr(34)
    cSQT = Chr(39)
    iCimtypeString = 8
    sClassName = "Win32_LocalGroupMember"
    
    ' Exit script if computer is a Domain Controller
    
    For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
    	if (oComputer.DomainRole >= 4) then _
    	wScript.Quit
    Next
    
    ' Clear class if exists
    
    For Each oSubclass in oWMI.SubclassesOf()
    	if oSubclass.Path_.Class = sClassName then _
    		oWMI.Get(sClassName).Delete_
    Next
    
    ' Create class
    
    Set oClass = oWMI.Get()
    oClass.Path_.Class = sClassName
    oClass.Properties_.add "MemberName" , iCimtypeString
    oClass.Properties_.add "MemberDomain" , iCimtypeString
    oClass.Properties_.add "MemberType" , iCimtypeString
    oClass.Properties_.add "Name" , iCimtypeString
    oClass.Properties_.add "Domain" , iCimtypeString
    oClass.Properties_.add "SID" , iCimtypeString
    oClass.Properties_("Name").Qualifiers_.add "key" , True
    oClass.Properties_("MemberName").Qualifiers_.add "key" , True
    oClass.Put_
    
    ' Return data to class
    
    Set oClass = oWMI.Get(sClassName).SpawnInstance_
    For Each oGroup in oWMI.ExecQuery("select * from win32_group where localaccount=1")
    	For Each oGroupUser in oWMI.ExecQuery("select PartComponent from Win32_GroupUser Where GroupComponent = "_
    	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
    		sSplit = split(oGroupUser.PartComponent,cDQT)
    		Select Case (lcase(split(sSplit(0),":")(1)))
    			Case "win32_systemaccount.domain="
    				oClass.MemberType = "SystemAccount"
    			Case "win32_useraccount.domain="
    				oClass.MemberType = "UserAccount"
    			Case "win32_group.domain="
    				oClass.MemberType = "Group"
    			Case Else
    				oClass.MemberType = "Unknown"
    		End Select
    		oClass.MemberDomain = sSplit(1)
    		oClass.MemberName = sSplit(3)
    		oClass.Name = oGroup.Name
    		oClass.Domain = oGroup.Domain
    		oClass.SID = oGroup.SID
    		oClass.Put_
    	Next
    Next


    Здравствуйте bobgreen84!

    Если вам не сложно, можете описать в нескольких шагах как вы именно это реализовали через SCCM?

    15 ноября 2012 г. 8:37
  • Я в SCCM делаю это через VBS-скрипт. В результате создается дополнительный класс WMI Win32_LocalGroupMember, который уже можно опрашивать и вести инвентаризацию по нему, чтобы класс постоянно обновлялся, то поставьте скрипт на планировщик задач, если интересно то вот код:

    ' Set variables
    
    Set oShell = CreateObject("Wscript.Shell")
    Set oWMI = GetObject("winmgmts:root\cimv2")
    cDQT = Chr(34)
    cSQT = Chr(39)
    iCimtypeString = 8
    sClassName = "Win32_LocalGroupMember"
    
    ' Exit script if computer is a Domain Controller
    
    For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
    	if (oComputer.DomainRole >= 4) then _
    	wScript.Quit
    Next
    
    ' Clear class if exists
    
    For Each oSubclass in oWMI.SubclassesOf()
    	if oSubclass.Path_.Class = sClassName then _
    		oWMI.Get(sClassName).Delete_
    Next
    
    ' Create class
    
    Set oClass = oWMI.Get()
    oClass.Path_.Class = sClassName
    oClass.Properties_.add "MemberName" , iCimtypeString
    oClass.Properties_.add "MemberDomain" , iCimtypeString
    oClass.Properties_.add "MemberType" , iCimtypeString
    oClass.Properties_.add "Name" , iCimtypeString
    oClass.Properties_.add "Domain" , iCimtypeString
    oClass.Properties_.add "SID" , iCimtypeString
    oClass.Properties_("Name").Qualifiers_.add "key" , True
    oClass.Properties_("MemberName").Qualifiers_.add "key" , True
    oClass.Put_
    
    ' Return data to class
    
    Set oClass = oWMI.Get(sClassName).SpawnInstance_
    For Each oGroup in oWMI.ExecQuery("select * from win32_group where localaccount=1")
    	For Each oGroupUser in oWMI.ExecQuery("select PartComponent from Win32_GroupUser Where GroupComponent = "_
    	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
    		sSplit = split(oGroupUser.PartComponent,cDQT)
    		Select Case (lcase(split(sSplit(0),":")(1)))
    			Case "win32_systemaccount.domain="
    				oClass.MemberType = "SystemAccount"
    			Case "win32_useraccount.domain="
    				oClass.MemberType = "UserAccount"
    			Case "win32_group.domain="
    				oClass.MemberType = "Group"
    			Case Else
    				oClass.MemberType = "Unknown"
    		End Select
    		oClass.MemberDomain = sSplit(1)
    		oClass.MemberName = sSplit(3)
    		oClass.Name = oGroup.Name
    		oClass.Domain = oGroup.Domain
    		oClass.SID = oGroup.SID
    		oClass.Put_
    	Next
    Next


    Здравствуйте bobgreen84!

    Если вам не сложно, можете описать в нескольких шагах как вы именно это реализовали через SCCM?


    http://systemcenter4all.wordpress.com/2012/06/17/local-group-membership/

    Vladimir Zelenov | http://systemcenter4all.wordpress.com

    • Помечено в качестве ответа KazunEditor 17 ноября 2012 г. 8:20
    16 ноября 2012 г. 13:16
  • Я в SCCM делаю это через VBS-скрипт. В результате создается дополнительный класс WMI Win32_LocalGroupMember, который уже можно опрашивать и вести инвентаризацию по нему, чтобы класс постоянно обновлялся, то поставьте скрипт на планировщик задач, если интересно то вот код:

    ' Set variables
    
    Set oShell = CreateObject("Wscript.Shell")
    Set oWMI = GetObject("winmgmts:root\cimv2")
    cDQT = Chr(34)
    cSQT = Chr(39)
    iCimtypeString = 8
    sClassName = "Win32_LocalGroupMember"
    
    ' Exit script if computer is a Domain Controller
    
    For Each oComputer in oWMI.ExecQuery("Select DomainRole from Win32_ComputerSystem")
    	if (oComputer.DomainRole >= 4) then _
    	wScript.Quit
    Next
    
    ' Clear class if exists
    
    For Each oSubclass in oWMI.SubclassesOf()
    	if oSubclass.Path_.Class = sClassName then _
    		oWMI.Get(sClassName).Delete_
    Next
    
    ' Create class
    
    Set oClass = oWMI.Get()
    oClass.Path_.Class = sClassName
    oClass.Properties_.add "MemberName" , iCimtypeString
    oClass.Properties_.add "MemberDomain" , iCimtypeString
    oClass.Properties_.add "MemberType" , iCimtypeString
    oClass.Properties_.add "Name" , iCimtypeString
    oClass.Properties_.add "Domain" , iCimtypeString
    oClass.Properties_.add "SID" , iCimtypeString
    oClass.Properties_("Name").Qualifiers_.add "key" , True
    oClass.Properties_("MemberName").Qualifiers_.add "key" , True
    oClass.Put_
    
    ' Return data to class
    
    Set oClass = oWMI.Get(sClassName).SpawnInstance_
    For Each oGroup in oWMI.ExecQuery("select * from win32_group where localaccount=1")
    	For Each oGroupUser in oWMI.ExecQuery("select PartComponent from Win32_GroupUser Where GroupComponent = "_
    	&cSQT&"\\\\"&oGroup.Domain&"\\root\\cimv2:Win32_Group.Domain="&cDQT&oGroup.Domain&cDQT&",Name="&cDQT&oGroup.Name&cDQT&cSQT)
    		sSplit = split(oGroupUser.PartComponent,cDQT)
    		Select Case (lcase(split(sSplit(0),":")(1)))
    			Case "win32_systemaccount.domain="
    				oClass.MemberType = "SystemAccount"
    			Case "win32_useraccount.domain="
    				oClass.MemberType = "UserAccount"
    			Case "win32_group.domain="
    				oClass.MemberType = "Group"
    			Case Else
    				oClass.MemberType = "Unknown"
    		End Select
    		oClass.MemberDomain = sSplit(1)
    		oClass.MemberName = sSplit(3)
    		oClass.Name = oGroup.Name
    		oClass.Domain = oGroup.Domain
    		oClass.SID = oGroup.SID
    		oClass.Put_
    	Next
    Next


    Здравствуйте bobgreen84!

    Если вам не сложно, можете описать в нескольких шагах как вы именно это реализовали через SCCM?


    http://systemcenter4all.wordpress.com/2012/06/17/local-group-membership/

    Vladimir Zelenov | http://systemcenter4all.wordpress.com

    У меня что-то не получается создать отчет по отображению доменных пользователей в локальных группах. Вы не могли бы описать как правильно это сделать?
    26 ноября 2012 г. 9:19