Colduction Posted January 21, 2020 Posted January 21, 2020 (edited) Hi, i have a source code of "Danny35d" and i have 2 main question that are: How to extract this function's results (Datas are as Array) to combo-box without set number of datas? When i type 1, 2 in _SystemUsers($AccountType = 0) to get only Local or Domain users, it just give me both of them, it's old problem of this function, please share us debugged code :)❤ expandcollapse popup#include <Array.au3> $Users = _ArrayToString(_SystemUsers(), "|", 1) ConsoleWrite($Users & @CRLF) #cs =============================================================================== Function: _SystemUsers($AccountType = 0) Description: Return an array with the local or domain username Parameter(s): $AccountType: Local, domain or both username 0 = Local and Domain usernames 1 = Local usernames only 2 = Domain usernames only Returns: An array with the list of usernames - Succeeded @error 1 - Didn't query any username @error 2 - Failed to create Win32_SystemUsers object @error 3 - Invalid $AccountType Author(s): Danny35d #ce =============================================================================== Func _SystemUsers($AccountType = 0) Local $aSystemUsers Local $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20 Local $colItems = "", $strComputer = "localhost" If Not StringRegExp($AccountType, '[012]') Then Return SetError(3, 3, '') $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SystemUsers", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $Output = StringSplit($objItem.PartComponent, ',') If IsArray($Output) Then $Temp = StringReplace(StringTrimLeft($Output[2], StringInStr($Output[2], '=', 0, -1)), '"', '') If $AccountType = 0 Or ($AccountType = 1 And @ComputerName = $Temp) Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' ElseIf $AccountType = 2 And @ComputerName <> $Temp Then $aSystemUsers &= StringReplace(StringTrimLeft($Output[1], StringInStr($Output[1], '=', 0, -1)), '"', '') & '|' EndIf EndIf Next $aSystemUsers = StringTrimRight($aSystemUsers, 1) If $aSystemUsers = '' Then Return(SetError(1, 1, $aSystemUsers)) Return(SetError(0, 0, StringSplit($aSystemUsers, '|'))) Else $aSystemUsers = '' Return(SetError(2, 2, $aSystemUsers)) EndIf EndFunc ;==>_SystemUsers Thanks to your best Team. Edited January 21, 2020 by InfernalScorpion
Nine Posted January 21, 2020 Posted January 21, 2020 For #1 it is very easy. Just create a GUI with a combo-box and use GUICtrlSetData ($idCombo, $Users) to store the values into the combo For #2, can you run this, see if you get all users this way (show the result if you can) : #include <Constants.au3> Global $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2") Local $Output = "Computer: " & @ComputerName & @CRLF $Output &= "==========================================" & @CRLF Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount") If not IsObj($colItems) then Exit Msgbox(0,"WMI Output","No WMI Objects Found") For $objItem In $colItems $Output &= "Caption: " & $objItem.Caption & @CRLF Next MsgBox ($MB_SYSTEMMODAL,"",$Output) Colduction 1 “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
Subz Posted January 21, 2020 Posted January 21, 2020 Unfortunately in a domain environment Win32_UserAccount (takes forever to resolve domain users) if your disconnected from the network it works fine or if you only require local users you can use that within the query. Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount Where LocalAccount = True") Couple of days ago I needed to query a couple of hundred user accounts that had profiles on multiple RDS servers and used the following method to get the user accounts: expandcollapse popup#include <Array.au3> #include <Security.au3> Global $g_aProfileList[0] _UserProfiles(4) _ArrayDisplay($g_aProfileList) ;~ $_vDomain : 0 - All Users on the system ;~ : 1 = NT Authority Users on the system ;~ : 2 = Local Users on the system ;~ : 3 = NT Authority + Local Users on the system ;~ : 4 = Domain Users on the system ;~ : 5 = NT Authority + Domain Users on the system ;~ : 6 = Local + Domain Users on the system Func _UserProfiles($_vDomain = 0) Local $sRegProfileList = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" Local $aAccountSid, $sRegProfileGuid, $i = 1 While 1 $sRegProfileGuid = RegEnumKey($sRegProfileList, $i) If @error Then ExitLoop $aAccountSid = _Security__LookupAccountSid($sRegProfileGuid) If @error Then ContinueLoop If IsArray($aAccountSid) Then While 1 Switch $_vDomain Case 1 If ($aAccountSid[1] <> "NT Authority") Then ExitLoop Case 2 If ($aAccountSid[1] <> @ComputerName) Then ExitLoop Case 3 If Not ($aAccountSid[1] = "NT Authority" Or $aAccountSid[1] = @ComputerName) Then ExitLoop Case 4 If ($aAccountSid[1] = "NT Authority" Or $aAccountSid[1] = @ComputerName) Then ExitLoop Case 5 If $aAccountSid[1] = @ComputerName Then ExitLoop Case 6 If $aAccountSid[1] = "NT Authority" Then ExitLoop EndSwitch ReDim $g_aProfileList[UBound($g_aProfileList) + 1] $g_aProfileList[UBound($g_aProfileList) - 1] = $aAccountSid[0] ExitLoop WEnd EndIf $i += 1 WEnd EndFunc Colduction 1
Colduction Posted January 22, 2020 Author Posted January 22, 2020 Thanks @Nine, your code was tidy & summarized, but i have a little question of your First Souloution that you told: 17 hours ago, Nine said: Just create a GUI with a combo-box and use GUICtrlSetData ($idCombo, $Users) to store the values into the combo but requires Loop such as For or Do, my question is here, how to use these Loops to set all datas in combo-box?
Colduction Posted January 22, 2020 Author Posted January 22, 2020 (edited) Hi @Subz, thanks for your care and your answer, i've tested your code on my machine and i didn't get all users, your code's problem is when a user was disabled such as Administrator or Guest, it doesn't show, but thanks for your reply :)❤ Edited January 22, 2020 by InfernalScorpion
Subz Posted January 22, 2020 Posted January 22, 2020 As Nine pointed out, you've already converted the array to string "_ArraytoString", so you just use "GuiCtrlSetData" to add that string to the combo box, there is no need for a loop Colduction 1
Colduction Posted January 22, 2020 Author Posted January 22, 2020 Whoaaa, i didn't think that Combo-box supports array data from _ArrayToString() and it does't require loop for set all datas in it😀 I should test it first, then ask it :) Thanks @Nine and @Subz, both of you helped me! Musashi 1
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now