Jump to content
Sign in to follow this  
kanishk619

Autoit doesnt always return same results

Recommended Posts

kanishk619

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
trancexx

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.

  • Like 2

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites
kanishk619

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
trancexx
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.

  • Like 2

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites
czardas
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  

  • Similar Content

    • JuanFelipe
      By JuanFelipe
      Hello friends, I have a simple question, can I have a variable that is not reset, even if my program is closed?
      That is, I want to make a program that can only be opened once, have a variable $ ini = 0, when it is opened for the first and only time it becomes $ ini = 1, so that it can not use the program a second time, as if it was a test software.
      I do not want the variable to depend on a reading of an external file that is easily manipulated. Thank you.
    • nooneclose
      By nooneclose
      My program has to first search for names in Column D that do not match up with column C. I got that search to work using arrays. It was slow and I could not figure out how to delete them so I just manually put coded the names that do not belong. I found their cell location but I do not know how to store that location and delete it.
      This is what I have so far.
      Local $NameToDelete1[6]  = _Excel_RangeFind($OpenWorkbook, "Smith, Bill") _ArrayDisplay($NameToDelete1, "Excel UDF: _Excel_RangeFind Example 1", "", 0, "|", "Sheet|Name|Cell|Value|Formula|Comment") _Excel_RangeDelete($OpenWorkbook.ActiveSheet, $NameToDelete1[2], $xlShiftUp)  
      Please help, I wanted to have this program done yesterday but I did not see this problem until yesterday. 
    • TrashBoat
      By TrashBoat
      So Im trying to make a simple 2d game and make some sort of collision detection so why not to make a 2 dimensional array but i have no clue how  to write it in multiple lines
      Global $map[5,5] = [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0] something like this but it doesn't work
    • Zein
      By Zein
      #include "..\Include\Array.au3" #include "..\Include\File.au3" #include "..\Include\AutoItConstants.au3" Local $aRetArray Local $sFilePath = "n.csv" _FileReadToArray($sFilePath, $aRetArray, ",") ; _FileReadToArray($sFilePath, $aRetArray, $FRTA_COUNT, ",") _ArrayDisplay($aRetArray, "Original", Default, 8) The above code shows two versions of _FileReadToArray and both don't work as expected.
      The first one doesn't use the comma as a delimiter. (so I get a single column array)  I tried adding "Default" between $aRetArray and "," then it told me it had an incorrect number of parameters. 

      I looked again at the documentation:
       
      #include <File.au3> _FileReadToArray ( $sFilePath, ByRef $vReturn [, $iFlags = $FRTA_COUNT [, $sDelimiter = ""]] )
      And I with or without the flags params I should be getting a 2D array due to my file being a csv. 
      I then tried a regular flag, $FRTA_COUNT, and it tells me that I'm using a variable $FRTA_COUNT while it's not declared. Tried putting in 1 instead and it told me again, incorrect number of params. 

       
    • nooneclose
      By nooneclose
      I need to perform a subtotal in excel and I would like to automate this process using Autoit if possible like always any and all help will be greatly appreciated. 
      I can not find a good example but the two from Microsoft. Here is one of the two from msdn.microsoft.com/en-us/vba/excel-vba/articles/range-subtotal-method-excel
      I do not really understand how to translate this into AutoIt, but I gave it a try and here is what I have.
      $OpenRange      = "A1:E200" $xlSum          = -4157 $Added_Array[2] = [2, 3] $OpenRange.Subtotal("B1", $xlSum, $Added_Array, True, False, True) I just need to perform a subtotal on a range based on a header called department, and then perform a sum on the results.
×