Sign in to follow this  
Followers 0
kanishk619

Autoit doesnt always return same results

5 posts in this topic

The following code contains 2 functions to achieve the same results, although function2 works fine whereas function1 returns different results

;#include <Array.au3>
#include <security.au3>
#include <WinAPI.au3>
#include <ProcessConstants.au3>

Global Const $TOKEN_MAXIMUM_ALLOWED = 0x02000000

Func _GetTokenPSid($hToken)
    Local $aCall = DllStructGetData(_Security__GetTokenInformation($hToken, $TOKENUSER), 1)
    $tempPtr = DllStructCreate("PTR")
    $ptrSize = DllStructGetSize($tempPtr)
    $rawSid = BinaryMid($aCall, $ptrSize * 2 + 1, BinaryLen($aCall))
    $mem = DllStructCreate("byte Attributes[" & BinaryLen($rawSid) & "]")
    DllStructSetData($mem, "Attributes", $rawSid)
    $pSid = DllStructGetPtr($mem)
    Return $pSid
EndFunc   ;==>_GetTokenPSid



Func _GetTokenUser1($hToken)
    $pSid = _GetTokenPSid($hToken)
    Local $aCall = DllCall("advapi32.dll", "bool", "LookupAccountSidW", "ptr", "", "ptr", $pSid, "wstr", "", "dword*", 65536, "wstr", "", "dword*", 65536, "int*", 0)
    If IsArray($aCall) Then
        Return $aCall[5] & "\" & $aCall[3]
    Else
        Return ""
    EndIf
EndFunc   ;==>_GetTokenUser


Func _GetTokenUser2($hToken)
    Local $aCall = DllStructGetData(_Security__GetTokenInformation($hToken, $TOKENUSER), 1)
    $tempPtr = DllStructCreate("PTR")
    $ptrSize = DllStructGetSize($tempPtr)
    $rawSid = BinaryMid($aCall, $ptrSize * 2 + 1, BinaryLen($aCall))
    $mem = DllStructCreate("byte Attributes[" & BinaryLen($rawSid) & "]")
    DllStructSetData($mem, "Attributes", $rawSid)
    $pSid = DllStructGetPtr($mem)
    Local $bCall = DllCall("advapi32.dll", "bool", "LookupAccountSidW", "ptr", "", "ptr", $pSID, "wstr", "", "dword*", 65536, "wstr", "", "dword*", 65536, "int*", 0)
    If IsArray($bCall) Then
        Return $bCall[5] & "\" & $bCall[3]
    Else
        Return ""
    EndIf
EndFunc


Func _ProcessTokenInfo($pid)
    $hToken = _Security__OpenProcessToken(_WinAPI_OpenProcess($TOKEN_MAXIMUM_ALLOWED, 0, $pid), $TOKEN_QUERY)
    If Not $hToken Then
        $hToken = _Security__OpenProcessToken(_WinAPI_OpenProcess($PROCESS_QUERY_LIMITED_INFORMATION, 0, $pid), $TOKEN_QUERY)
    EndIf
    ConsoleWrite("GetTokenUser1 : " & _GetTokenUser1($hToken) & @CRLF)
    ConsoleWrite("GetTokenUser2 : " & _GetTokenUser2($hToken) & @CRLF)
    ConsoleWrite(@CRLF)
    _WinAPI_CloseHandle($hToken)
    Return
EndFunc   ;==>_ProcessTokenInfo


For $i = 1 To 10
    _ProcessTokenInfo(856)
Next

Below are the results

Quote

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : Test-PC\Test
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : \
GetTokenUser2 : Test-PC\Test

GetTokenUser1 : Test-PC\Test
GetTokenUser2 : Test-PC\Test

Am I doing something wrong here ?

Share this post


Link to post
Share on other sites

Yes you are. First one is wrong because the structure you create inside _GetTokenPSid gets destroyed before used. Then you use pointer to it in _GetTokenUser1. Pointer to lost space.
You're lucky if it don't crash.

2 people like this

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Thanks for pointing out the mistake, I have made the below changes

Func _GetTokenPSid($hToken)
    Local $aCall = DllStructGetData(_Security__GetTokenInformation($hToken, $TOKENUSER), 1)
    $tempPtr = DllStructCreate("PTR")
    $ptrSize = DllStructGetSize($tempPtr)
    $rawSid = BinaryMid($aCall, $ptrSize * 2 + 1, BinaryLen($aCall))
    $tBuffer = DllStructCreate("byte Attributes[" & BinaryLen($rawSid) & "]")
    DllStructSetData($tBuffer, "Attributes", $rawSid)
    Return $tBuffer
EndFunc   ;==>_GetTokenPSid

Func _GetTokenUser1($hToken)
    $aCall = _GetTokenPSid($hToken)
    $pSid =  DllStructGetPtr($aCall)
    $aCall = _Security__LookupAccountSid($pSID)
    If IsArray($aCall) Then
        Return $aCall[1] & "\" & $aCall[0]
    Else
        Return ""
    EndIf
EndFunc   ;==>_GetTokenUser

The above works,  but I'm not sure why the below code doesn't (I mostly use python hence m trying to figure out why this shouldn't work).

Func _GetTokenUser1($hToken)
    $aCall = _Security__LookupAccountSid(DllStructGetPtr(_GetTokenPSid($hToken))
    ConsoleWrite(DllStructGetPtr(_GetTokenPSid($hToken)) & " , " &  DllStructGetData(_GetTokenPSid($hToken),1) & @CRLF)
    If IsArray($aCall) Then
        Return $aCall[1] & "\" & $aCall[0] & @CRLF
    Else
        Return ""
    EndIf
EndFunc   ;==>_GetTokenUser

Output 
 

Quote

0x0000006B85EB4340 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : Test-PC\Test
GetTokenUser2 : Test-PC\Test

0x0000006B85EB47F0 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4370 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4BB0 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4400 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4BB0 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB45E0 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB44C0 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4880 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test

0x0000006B85EB4C40 , 0x010500000000000515000000AE9CF4E5A3A1353347837BC4E9030000
GetTokenUser1 : 
GetTokenUser2 : Test-PC\Test


The buffer is always the same, is it always required to assign function calls to variables?

Edited by kanishk619

Share this post


Link to post
Share on other sites
1 hour ago, kanishk619 said:

Thanks for pointing out the mistake, I have made the below changes

Func _GetTokenPSid($hToken)
    Local $aCall = DllStructGetData(_Security__GetTokenInformation($hToken, $TOKENUSER), 1)
    $tempPtr = DllStructCreate("PTR")
    $ptrSize = DllStructGetSize($tempPtr)
    $rawSid = BinaryMid($aCall, $ptrSize * 2 + 1, BinaryLen($aCall))
    $tBuffer = DllStructCreate("byte Attributes[" & BinaryLen($rawSid) & "]")
    DllStructSetData($tBuffer, "Attributes", $rawSid)
    Return $tBuffer
EndFunc   ;==>_GetTokenPSid

Func _GetTokenUser1($hToken)
    $aCall = _GetTokenPSid($hToken)
    $pSid =  DllStructGetPtr($aCall)
    $aCall = _Security__LookupAccountSid($pSID)
    If IsArray($aCall) Then
        Return $aCall[1] & "\" & $aCall[0]
    Else
        Return ""
    EndIf
EndFunc   ;==>_GetTokenUser

The above works,  but I'm not sure why the below code doesn't (I mostly use python hence m trying to figure out why this shouldn't work).

Func _GetTokenUser1($hToken)
    $aCall = _Security__LookupAccountSid(DllStructGetPtr(_GetTokenPSid($hToken))
    ConsoleWrite(DllStructGetPtr(_GetTokenPSid($hToken)) & " , " &  DllStructGetData(_GetTokenPSid($hToken),1) & @CRLF)
    If IsArray($aCall) Then
        Return $aCall[1] & "\" & $aCall[0] & @CRLF
    Else
        Return ""
    EndIf
EndFunc   ;==>_GetTokenUser

Output 
 


The buffer is always the same, is it always required to assign function calls to variables?

No, of course not. Preferable way is to use function calls over assigning the result to variable.
However, it really depends what the function returns. In your case the returned value is dllstruct. That struct (if not assigned to variable) exists only while that segment of code is executed.

It's really not complicated, and very much logical.

2 people like this

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

2 hours ago, trancexx said:

Preferable way is to use function calls over assigning the result to variable.

I believe I'm guilty of not following this logical advice. Having said that, I did some performance tests a while ago and as expected - you are right. :) Again.

Edited by czardas

Share this post


Link to post
Share on other sites

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
Sign in to follow this  
Followers 0

  • Similar Content

    • Ascer
      By Ascer
      1. Description
      Anti-bot system to avoid spam. Vector graphic style generates 4 random numbers from 0-9 and create a picture. 2. Requirements
      .NET Framework 1.1 - 4.5 (on this version Microsoft destroy old rules) 3. Possibilities.

      4. Downloads.
      Source package Capatcha.rar
    • Valnurat
      By Valnurat
      How can I get combobox value by using  the ENTER key?
    • vyperhand
      By vyperhand
      I'm struggling to launch a VBS file via autoit using RunWait.  Due to the nature of the deployment tool I am using for said script, I only know that the .vbs files will be in the same directory as my AutoIt-generated .exe, but not what that path will be.  The path will look something like this:
      c:\programdata\vendor\lots\of\folders\randomnumber
      This is generated during deployment and I have no way of predicting the path - therefore, I am not sure how to call back to "same directory" in order to successfully launch the .vbs.
      This line is as close as I have gotten - this fires off the cmd window, but it closes immediately with out information, and the .vbs is not launched.
      RunWait (@ComSpec & " /c" & 'cscript.exe WORKPLEASE.vbs ALL /Q /NoCancel') I thought /c might be the problem, but leaving out the /c element causes me not to even see the momentary CMD window flash by.  Any help will be greatly appreciated, and thanks in advance.
    • Valnurat
      By Valnurat
      I have a ComboBox and I want, when I start writting in it, that it will show me what is the first in the list.
      Like, is I start writting:
      "pe" it  should show me "peter" if that is the first in the list.
      How can I do that?
       
      While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idClos ExitLoop Case $idComboBox $sComboRead = GUICtrlRead($idComboBox) Local $iIdx = _ArraySearch($aResult,$sComboRead,0,0,0,0,1,1) Local $aComputerOwner = _AD_GetObjectsInOU("OU=al,DC=AD,DC=AL,DC=ORG","(&(objectclass=computer)(managedby=" & $aResult[$iIdx][0] & "))",Default,"cn") _ArrayDelete($aComputerOwner,0) _GUICtrlListView_SetItemCount($idMylist,UBound($aComputerOwner)) If IsArray($aComputerOwner) Then For $i = 0 To UBound($aComputerOwner) - 1 GUICtrlCreateListViewItem($aComputerOwner[$i], $idMylist) Next Else GUICtrlSetData($idMylist, "No computer|") EndIf EndSwitch WEnd  
    • Valnurat
      By Valnurat
      Hi.
      I'm trying to add an array to my gui listview, but it fails with
      "C:\Program Files (x86)\AutoIt3\Include\GuiListView.au3" (473) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: DllStructSetData($tBuffer, "Text", $aItems[$iI][0]) DllStructSetData($tBuffer, "Text", ^ ERROR My code is:
      #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.2 Author: myName Script Function: Template AutoIt script. #ce ---------------------------------------------------------------------------- ; Script Start - Add your code below here #include <WindowsConstants.au3> #include <ComboConstants.au3> #include <GuiComboBox.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <MsgBoxConstants.au3> #Include <AD.au3> #include <Array.au3> Opt('MustDeclareVars', 1) Global $aResult[0][2] Local $aNames[4] = ["DKSO","DKKO","SELU","SEES"] Local Const $iWidth = 300, $iHeight = 250, $iW = 85, $iH = 25 Local $hGUI = GUICreate("Find Computer Owner", $iWidth, $iHeight) ; Create a combobox control. Local $idComboBox = GUICtrlCreateCombo("", 2, 2, 296, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $WS_VSCROLL, $CBS_SORT)) ;$WS_VSCROLL Local $idMylist = GUICtrlCreateListView("", 2, 114, 296, 100) Local $idClos = GUICtrlCreateButton("Close", ($iWidth - $iW) / 2, ($iHeight - $iH) - 7 , $iW, $iH) _AD_Open() Local $sFill = "" For $i = 0 to UBound($aNames) -1 Local $aUserInfo = _AD_GetObjectsInOU("OU=Al,DC=ad,DC=al,DC=org","(&(objectCategory=Person)(objectclass=user)(sAMAccountName=" & $aNames[$i] & "*))","","distinguishedName,cn") if @error Then MsgBox(0,@error,@extended) Exit EndIf For $x = $aUserInfo[0][0] To 1 Step -1 If $aUserInfo[$x][0] = "" Or StringInStr($aUserInfo[$x][0], "Resources") > 0 Or StringInStr($aUserInfo[$x][0], "Leavers") > 0 Or StringInStr($aUserInfo[$x][0], "Administration") > 0 Then _ArrayDelete($aUserInfo, $x) EndIf Next _ArrayConcatenate($aResult, $aUserInfo, 1) Next for $i = 0 To UBound($aResult) -1 If $aResult[$i][0] <> "" Then $sFill &= $aResult[$i][1] & "|" EndIf Next _ArrayDisplay($aResult, 'AD ' & UBound($aResult)) $sFill = StringTrimRight($sFill, 1) _GUICtrlComboBox_BeginUpdate($idComboBox) GUICtrlSetData($idComboBox, $sFill, "") _GUICtrlComboBox_EndUpdate($idComboBox) GUISetState(@SW_SHOW, $hGUI) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") _GUICtrlListView_AddColumn($idMylist, "Computername", 296) Local $sComboRead = "" ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idClos ExitLoop Case $idComboBox $sComboRead = GUICtrlRead($idComboBox) Local $iIdx = _ArraySearch($aResult,$sComboRead,0,0,0,0,1,1) Local $aComputerOwner = _AD_GetObjectsInOU("OU=al,DC=AD,DC=AL,DC=ORG","(&(objectclass=computer)(managedby=" & $aResult[$iIdx][0] & "))",Default,"cn") _ArrayDelete($aComputerOwner,0) _ArrayDisplay($aComputerOwner) _GUICtrlListView_SetItemCount($idMylist,UBound($aComputerOwner)) If IsArray($aComputerOwner) Then MsgBox(0,"Test",$sComboRead) _GUICtrlListView_AddArray($idMylist, $aComputerOwner) ; <---- it fails Else GUICtrlSetData($idMylist, "No computer|") EndIf EndSwitch WEnd _AD_Close() ; Delete the previous GUI and all controls. GUIDelete($hGUI) Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo ; Local $tBuffer $hWndListView = $idMylist If Not IsHWnd($idMylist) Then $hWndListView = GUICtrlGetHandle($idMylist) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) _DebugPrint("$NM_DBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode & @CRLF & _ "-->Index:" & @TAB & DllStructGetData($tInfo, "Index") & @CRLF & _ "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _ "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _ "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _ "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _ "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _ "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _ "-->lParam:" & @TAB & DllStructGetData($tInfo, "lParam") & @CRLF & _ "-->KeyFlags:" & @TAB & DllStructGetData($tInfo, "KeyFlags")) ; No return value EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _DebugPrint($s_Text, $sLine = @ScriptLineNumber) ConsoleWrite( _ "!===========================================================" & @CRLF & _ "+======================================================" & @CRLF & _ "-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $s_Text & @CRLF & _ "+======================================================" & @CRLF) EndFunc ;==>_DebugPrint Do I do it wrong?
       
      Thank you in advanced.