Jump to content

Need help listing users on a system...


fly
 Share

Recommended Posts

I am recoding an application I wrote into AutoIt cause I really like the language and support. However, as a n00b, I'm kinda lost.

What would be the best way to get a list of users on a PC and throw it into a COMBO box? Previously, I just listed all the folder names in C:\Documents and Settings in the combo box. is there a way to do either that or list all the users in HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\{SID}\ProfileImagePath?

My apologies for the silly question and thanks for your help!

Link to comment
Share on other sites

Hi fly,

This is function that I create for one of my script, it will give you a 2 dimensional array with 1) username and 2) Sid account it used registry key to get the information and also you can used for a remote system. The are three way to used:

1) $SID = _UserSID() ; It will give you all usernames and sid numbers from local computer

2) $SID = _UserSID("Danny"); It will give you only Danny SID number local computer

3) $SID = _UserSID("Danny", "HomeComputer") ; It will give you only Danny SID number from HomeComputer

dim $SID

$SID = _UserSID() 
;$SID = _UserSID("UserName")
;$SID = _UserSID('UserName', 'RemoteComputerName')

if IsArray($SID) Then
    for $x = 1 to $SID[0][0]
        msgbox(0, 'User SID', $SID[0][$x] & ' ====> ' & $SID[1][$x])
    Next
Else
    MsgBox(0, "", "Is not an Array.")
EndIf

;===============================================================================
; Function Name:   _UserSID()
;
; Description:   Return a 2 dimensional array first username second SID.
;
; Syntax:         _UserSID ( [$s_UserName, $s_RemoteComputer] )
;
; Parameter(s): $s_UserName = Username to get SID.
;                  $s_RemoteComputer = ComputerName on the network
;                
; Requirement(s):  External:   = None.
;                 Internal:   = None.
;
; Return Value(s): On Success: = Returns 2 dimensional array with UserName, SID and sets @error to 0.
;                 On Failure: = Returns "" and sets @error to 1.
;
; Author(s):       Dan Colón
;
; Note(s):       
;
; Example(s):
;   _UserSID("DColon") it will return DColon SID
;   _UserSID() it will return every user SID
;===============================================================================

Func _UserSID($s_UserName = "All", $s_RemoteComputer = '')
    If $s_UserName = '' Then $s_UserName = 'All'
    If $s_RemoteComputer <> '' Then
        If StringMid($s_RemoteComputer, 1, 1) <> '\' Or StringMid($s_RemoteComputer, 2, 1) <> '\' Or StringRight($s_RemoteComputer, 1) <> '\' Then
            $s_RemoteComputer = '\\' & StringReplace($s_RemoteComputer, '\', '') & '\'
        EndIf
    EndIf
    
    Local $line, $var, $ProfilePath, $i = 1
    Local Const $regkey = $s_RemoteComputer & "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
    Local Const $regkeyval1 = "ProfilesDirectory"
    Local Const $regkeyval2 = "ProfileImagePath"
        
    $ProfilePath = RegRead($regkey, $regkeyval1)    
    While 1
        $line = RegEnumkey($regkey, $i)
        $var = RegRead ( $regkey & $line, $regkeyval2)
        If @error = 1 Or @error = -1 Then ExitLoop
        If $s_UserName == "All" Then 
            If Not IsDeclared("aArray") Then Dim $aArray[1][1]
            ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
            $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
            $aArray[1][UBound($aArray) - 1] = $line 
            $aArray[0][0] = UBound($aArray) - 1
        ElseIf StringLower($var) == StringLower($ProfilePath & "\" & $s_UserName) Then
            If Not IsDeclared("aArray") Then Dim $aArray[1][1]
            ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
            $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
            $aArray[1][UBound($aArray) - 1] = $line 
            $aArray[0][0] = UBound($aArray) - 1
        EndIf
        $i = $i + 1
    WEnd
    If Not IsDeclared("aArray") Then
        SetError(1)
        Return("")
    Else
        SetError(0)
        Return($aArray)
    EndIf
EndFunc

Then all you have to do is used a for loop

for $x = 1 to $SID[0][0]

_GUICtrlComboAddString($h_combobox, $SID[0][$x])

next

and that will add username to the combo list

I hope this will help you to get started....

AutoIt Scripts:NetPrinter - Network Printer UtilityRobocopyGUI - GUI interface for M$ robocopy command line
Link to comment
Share on other sites

Im using the new beta 3.1.1.84 check this link AutoIt Beta

Crap. Doesn't look like I can use that. As soon as I put in:

#include <GuiCombo.au3>

The app blows up with this error:

C:\Program Files\AutoIt3\Include\Misc.au3(64,40) : ERROR: DllStructCreate(): undefined function.

Local $p = DllStructCreate ($struct)

I'm gonna try to uninstall/reinstall everything...

Link to comment
Share on other sites

Don't worry welcome to AutoIt...

anyway I'm still a n00b....

If I can pester you again, I tried changing your script, as I only need the userid from the array.

Here is what I changed:

If $s_UserName == "All" Then
            If Not IsDeclared("aArray") Then Dim $aArray[1]
            ReDim $aArray[UBound($aArray) + 1]
            $aArray[UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
           ;$aArray[1][UBound($aArray) - 1] = $line 
            $aArray[0] = UBound($aArray) - 1

It seems to work, except the first thing in the array is the number 8. Not sure why. Also, for whatever reason, arrays still confuse me so its probably something obvious.

Link to comment
Share on other sites

  • 2 months later...

Hi fly,

This is function that I create for one of my script, it will give you a 2 dimensional array with 1) username and 2) Sid account it used registry key to get the information and also you can used for a remote system. The are three way to used:

1) $SID = _UserSID() ; It will give you all usernames and sid numbers from local computer

2) $SID = _UserSID("Danny"); It will give you only Danny SID number local computer

3) $SID = _UserSID("Danny", "HomeComputer") ; It will give you only Danny SID number from HomeComputer

dim $SID

$SID = _UserSID() 
;$SID = _UserSID("UserName")
;$SID = _UserSID('UserName', 'RemoteComputerName')

if IsArray($SID) Then
    for $x = 1 to $SID[0][0]
        msgbox(0, 'User SID', $SID[0][$x] & ' ====> ' & $SID[1][$x])
    Next
Else
    MsgBox(0, "", "Is not an Array.")
EndIf

;===============================================================================
; Function Name:   _UserSID()
;
; Description:   Return a 2 dimensional array first username second SID.
;
; Syntax:         _UserSID ( [$s_UserName, $s_RemoteComputer] )
;
; Parameter(s): $s_UserName = Username to get SID.
;                  $s_RemoteComputer = ComputerName on the network
;                
; Requirement(s):  External:   = None.
;                 Internal:   = None.
;
; Return Value(s): On Success: = Returns 2 dimensional array with UserName, SID and sets @error to 0.
;                 On Failure: = Returns "" and sets @error to 1.
;
; Author(s):       Dan Colón
;
; Note(s):       
;
; Example(s):
;   _UserSID("DColon") it will return DColon SID
;   _UserSID() it will return every user SID
;===============================================================================

Func _UserSID($s_UserName = "All", $s_RemoteComputer = '')
    If $s_UserName = '' Then $s_UserName = 'All'
    If $s_RemoteComputer <> '' Then
        If StringMid($s_RemoteComputer, 1, 1) <> '\' Or StringMid($s_RemoteComputer, 2, 1) <> '\' Or StringRight($s_RemoteComputer, 1) <> '\' Then
            $s_RemoteComputer = '\\' & StringReplace($s_RemoteComputer, '\', '') & '\'
        EndIf
    EndIf
    
    Local $line, $var, $ProfilePath, $i = 1
    Local Const $regkey = $s_RemoteComputer & "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
    Local Const $regkeyval1 = "ProfilesDirectory"
    Local Const $regkeyval2 = "ProfileImagePath"
        
    $ProfilePath = RegRead($regkey, $regkeyval1)    
    While 1
        $line = RegEnumkey($regkey, $i)
        $var = RegRead ( $regkey & $line, $regkeyval2)
        If @error = 1 Or @error = -1 Then ExitLoop
        If $s_UserName == "All" Then 
            If Not IsDeclared("aArray") Then Dim $aArray[1][1]
            ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
            $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
            $aArray[1][UBound($aArray) - 1] = $line 
            $aArray[0][0] = UBound($aArray) - 1
        ElseIf StringLower($var) == StringLower($ProfilePath & "\" & $s_UserName) Then
            If Not IsDeclared("aArray") Then Dim $aArray[1][1]
            ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
            $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
            $aArray[1][UBound($aArray) - 1] = $line 
            $aArray[0][0] = UBound($aArray) - 1
        EndIf
        $i = $i + 1
    WEnd
    If Not IsDeclared("aArray") Then
        SetError(1)
        Return("")
    Else
        SetError(0)
        Return($aArray)
    EndIf
EndFunc

Then all you have to do is used a for loop

for $x = 1 to $SID[0][0]

_GUICtrlComboAddString($h_combobox, $SID[0][$x])

next

and that will add username to the combo list

I hope this will help you to get started....

I followed your directions, but I'm not able to populate the combolist, can you possibly show me with a sample script how to use it?

Thank you.

Link to comment
Share on other sites

  • 1 year later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...