Jump to content
TMelanson

Using non system variable with WMI

Recommended Posts

TMelanson

Hi folks,

I'm hoping someone can help me out here.

Background:
I have the need to run a program with admin credentials (#RequireAdmin), and then get the SID of the locally logged in account. Not the admin account.

If you look at the attached script, Line 16 uses the @UserName variable and returns the SID for the admin account I used to launch the app.
I want to use line 17 which passes the result of the _GetUsername function which is a username using  ($UserName) to the WMIService.

I'm getting " The requested action with this object has failed.:" error message.

Any suggestions would be appreciated! :D

 

test1.au3

Share this post


Link to post
Share on other sites
genius257

I'm no expert with "winmgmts", but i can say the reason why the object fails, is the method "Get" with your properties is throwing an exception. And AutoIt does not work well with object exceptions, without catching object events.

I would think the code below MIGHT be a solution.

MsgBox(0, "", _Security__SidToStringSid(_Security__GetAccountSid($UserName)))

otherwise something like this:

$objAccount = $objWMIService.ExecQuery("SELECT SID FROM Win32_UserAccount WHERE Name='"&@UserName&"'"); i use @UserName, as the return from "_GetUsername()" contains string terminating char(s) and makes the query fail.
For $row in $objAccount
    ConsoleWrite($row.Name&@CRLF)
    ConsoleWrite($row.SID&@CRLF)
Next

 

Anyway, i hope some of this will be helpful.

  • Like 1

Share this post


Link to post
Share on other sites
jguinch

Here is a way to get the list of logged on users (from the registry)  :

#RequireAdmin


#include <Security.au3>
#include <Array.au3>

Local $aLoggedOnUsers = _GetLoggedOnUsers()
_ArrayDisplay($aLoggedOnUsers)

Func _GetLoggedOnUsers()
    Local $sSubkey, $i = 0, $aUserInfo, $aResult[1][2], $iCount
    While 1
        $i += 1
        $sSubkey = RegEnumKey("HKEY_USERS", $i)
        If @error Then ExitLoop

        If StringRegExp($sSubkey, "^S-1-5-21-(\d+-){3}\d+$") Then
            $iCount += 1
            $aUserInfo = _Security__LookupAccountSid ($sSubkey )

            Redim $aResult[$iCount + 1][2]
            $aResult[$iCount][0] = $aUserInfo[1] & "\" & $aUserInfo[0]
            $aResult[$iCount][1] = $sSubkey
        EndIf
    WEnd
    $aResult[0][0] = $iCount
    Return $aResult
EndFunc

 

  • Like 1

Share this post


Link to post
Share on other sites
TMelanson
16 hours ago, genius257 said:

I'm no expert with "winmgmts", but i can say the reason why the object fails, is the method "Get" with your properties is throwing an exception. And AutoIt does not work well with object exceptions, without catching object events.

I would think the code below MIGHT be a solution.

MsgBox(0, "", _Security__SidToStringSid(_Security__GetAccountSid($UserName)))

otherwise something like this:

$objAccount = $objWMIService.ExecQuery("SELECT SID FROM Win32_UserAccount WHERE Name='"&@UserName&"'"); i use @UserName, as the return from "_GetUsername()" contains string terminating char(s) and makes the query fail.
For $row in $objAccount
    ConsoleWrite($row.Name&@CRLF)
    ConsoleWrite($row.SID&@CRLF)
Next

 

Anyway, i hope some of this will be helpful.

Thank you so much genius257! This works like a charm but it take a considerably longer time to generate the SID. Not sure why but it works :)

Share this post


Link to post
Share on other sites
TMelanson
15 hours ago, jguinch said:

Here is a way to get the list of logged on users (from the registry)  :

#RequireAdmin


#include <Security.au3>
#include <Array.au3>

Local $aLoggedOnUsers = _GetLoggedOnUsers()
_ArrayDisplay($aLoggedOnUsers)

Func _GetLoggedOnUsers()
    Local $sSubkey, $i = 0, $aUserInfo, $aResult[1][2], $iCount
    While 1
        $i += 1
        $sSubkey = RegEnumKey("HKEY_USERS", $i)
        If @error Then ExitLoop

        If StringRegExp($sSubkey, "^S-1-5-21-(\d+-){3}\d+$") Then
            $iCount += 1
            $aUserInfo = _Security__LookupAccountSid ($sSubkey )

            Redim $aResult[$iCount + 1][2]
            $aResult[$iCount][0] = $aUserInfo[1] & "\" & $aUserInfo[0]
            $aResult[$iCount][1] = $sSubkey
        EndIf
    WEnd
    $aResult[0][0] = $iCount
    Return $aResult
EndFunc

 

Oh this is a much quicker way to obtain the SID. Thanks so much jguinch!

Share this post


Link to post
Share on other sites
genius257
1 minute ago, TMelanson said:

Thank you so much genius257! This works like a charm but it take a considerably longer time to generate the SID. Not sure why but it works

Happy to help :)

Yeah, i imagine a better, faster way exists, but i don't know enough about it to be able to help, I'm afraid :)

  • Like 1

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

  • Similar Content

    • PramodR
      By PramodR
      Hello,
      I have to execute below block of code in elevated previllage, as that particular wmic class will work only with admin previlage.
      i am getting out put when i launch autoit as administrator,  but i will not be able to launch autoit as admin in this particular case but my user have admin rights.
      is there any better way i can run those command as administrator.?
      tried below steps:
      i have tried #RequireAdmin but that creates a user prompt  Tried using Runas command but gives error as wrong username or password , stuck with that step.  
       
    • FrancescoDiMuro
      By FrancescoDiMuro
      Good evening everyone
      I'm working on a little project of mines, and I was trying to use WMI Object.
      The question which I don't find an answer is: 
      Once I do the query with WMI Object, something like "SELECT * FROM Win32_LogonSession", instead of specify the field of the collection returned, ( i.e. $colItems.Caption ), can I loop though each property and each value of the property, writing so one row of code only?
      Hope my question was clear enough.
      Thanks in advance.

      Best Regards.
    • dwaynek
      By dwaynek
      traytip isn't working in windows 10. nothing happens when i use the Traytip command.
      here's a simple script i used:
      TrayTip("I'm a title", "I'm the message", 5) i tried changing the registry setting HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced ( which didn't have EnableBalloonTips) and creating a DWORD entry called EnableBalloonTips and setting it to 1 and logging off then back in. that did not resolve the problem.
      i'm running Windows 10 v1709 b16299.431
    • California
      By California
      Hello,
      I wrote a benchmark script to measure variable declarations
      to find out whether you should focus more on static or global variables
      #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 #ce ---------------------------------------------------------------------------- #Region Pre-Setting Local $iTally1 = 0 Local $iTally2 = 0 Local $iTally3 = 0 Local $iTally4 = 0 Local $iTally5 = 0 Local $iTally6 = 0 Local $iTally7 = 0 Global $GLOBALCONST1 = 1 Global $GLOBALCONST2 = 1 Global $GLOBALCONST3 = 1 Global $GLOBALCONST4 = 1 Global $GLOBALCONST5 = 1 #EndRegion Pre-Setting #Region Test Functions Func s1() Static $i = $GLOBALCONST1 Return $i EndFunc Func g2() Return $GLOBALCONST2 EndFunc Func g3() Static $i7 = "gsdgdfegbgbrwefw" Return $GLOBALCONST3 EndFunc Func g4() Static $i1 = 1 Static $i2 = "asd" Static $i3 = 234 Static $i4 = True Static $i5 = [0] Static $i6 = "hgsdg" Static $i7 = 1 Static $i8 = 1 Static $i9 = 1 Static $i0 = 1 Return $GLOBALCONST4 EndFunc Func g5() Local $i = $GLOBALCONST5 Return $i EndFunc Func g6() Local $i = 1 Return $i EndFunc Func g7() Return 1 EndFunc #EndRegion Test Functions #Region Benchmark Loop For $i = 0 To 15 Local $tDelta = TimerInit() Do $iTally1 += s1() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally2 += g2() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally3 += g3() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally4 += g4() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally5 += g5() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally6 += g6() Until TimerDiff($tDelta) >= 1000 Local $tDelta = TimerInit() Do $iTally7 += g7() Until TimerDiff($tDelta) >= 1000 Next #EndRegion Benchmark Loop ConsoleWrite(@CRLF&"Static1: "&$iTally1&" pkt"&@CRLF&"Global2: "&$iTally2&" pkt"&@CRLF&"Global3: "&$iTally3&" pkt"&@CRLF&"Global4: "&$iTally4&" pkt"&@CRLF&"Local5: "&$iTally5&" pkt"&@CRLF&"Local6: "&$iTally6&" pkt"&@CRLF&"Hardcode7:"&$iTally7&" pkt"&@CRLF) #cs Result Static1: 10291881 pkt global to static Global2: 13977324 pkt only global Global3: 9886169 pkt global and static Global4: 2933051 pkt global and many statics Local5: 9937314 pkt global to local Local6: 10306484 pkt only local Hardcode7: 14835319 pkt no variable #ce Result:
      100% no variable, hardcore value
      94% only global variable use
      69% only local variable use with hardcore value set
      69% only static variable use with global variable value set
      67% declaration of local variable with global variable value set
      66% only global variable use with one static variable beside
      20% only global variable use with ten static variables beside
      My thesis of the result:
      Be careful with declarations, whether local, global or static Note: in my test the global variable performance was better than the local one, but in practice the global one would lose performance due to multiple operations
       
      What is your best practice sharing data between multiple functions?
    • antonioj84
      By antonioj84
      Hi all to the forum guru and expert I am trying to  automate this. in the registry  I have the network profile name network 2 and network   I want to  change their  CATEGORY  to Private .  Can someone lead me in the right direction.
      Private is 1 and Public is 0
      #RequireAdmin Global $sHKLMRoot = @OSArch = "x64" ? "HKLM64" : "HKLM" RegWrite($sHKLMRoot &"\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\NewNetworks" ,'/v NetworkList /t REG_MULTI_SZ /d 00000000 /f') see  attached picture below
      Much appreaciate
       

×