Avatar billede dyne-jensen Juniormester
17. april 2022 - 03:15 Der er 2 kommentarer

AutoIt-script

Hej. Nogen der ved, hvordan jeg får denne kode til at sammenligne værdierne med hinanden i stedet for at resultaterne bliver vist i to dialogbokse? Jeg har forsøgt at sætte dem op mod hinanden, hvor resultatet ender med at blive et nej (dvs. de er ikke identiske).

Koden skal bruges i en sammenhæng, hvor en brugerkonto skal være en ægte konto med administratorrettigheder for at køre programmet og ikke en gæstekonto f.eks. der bliver tildelt administratorrettigheder midlertidigt. Ved "Kør som administrator..." på en almindelig brugerkonto forsvinder oplysningerne om standardkontoen man er logget på som, og jeg kan derfor ikke blokere for kørslen, hvilket er nødvendigt, da der opstår fejl.

Ved at sammenligne det reelle kontonavn med kontonavnet for de tildelte administratorrettigheder sikrer jeg, at det er en reel administratorkonto programmet kører fra.

Det er værdierne fra @UserName og _GetUsername() der skal sammenlignes. Men en typisk == og et efterfølgende IF og ELSE medfører altid, at resultatet bliver negativt - selv på en administratorkonto, hvor begge værdier bliver det samme i begge dialogbokse.

Koden er fejlfri i sin nuværende form og fundet på internettet, men er ikke anvendelig for mig. :-)




#RequireAdmin

MsgBox(0, 0, @UserName)
MsgBox(0, 0, _GetUsername())

Func _GetUsername()
    Local $aResult = DllCall("Wtsapi32.dll", "int", "WTSQuerySessionInformationW", "int", 0, "dword", -1, "int", 5, "dword*", 0, "dword*", 0)
    If @error Or $aResult[0] = 0 Then Return SetError(1, 0, 0)
    Local $sUsername = BinaryToString(DllStructGetData(DllStructCreate("byte[" & $aResult[5] & "]", $aResult[4]), 1), 2)
    DllCall("Wtsapi32.dll", "int", "WTSFreeMemory", "ptr", $aResult[4])
    Return $sUsername
EndFunc  ;==>_GetUsername
Avatar billede ejvindh Guru
19. april 2022 - 20:51 #1
Du kan gøre det med en stringcompare:

#RequireAdmin

If StringCompare ( _GetUsername(), @UserName) Then
  MsgBox(0, 0, "Identiske")
Else
  MsgBox(0,0, "Forskellige")
EndIf


Func _GetUsername()
    Local $aResult = DllCall("Wtsapi32.dll", "int", "WTSQuerySessionInformationW", "int", 0, "dword", -1, "int", 5, "dword*", 0, "dword*", 0)
    If @error Or $aResult[0] = 0 Then Return SetError(1, 0, 0)
    Local $sUsername = BinaryToString(DllStructGetData(DllStructCreate("byte[" & $aResult[5] & "]", $aResult[4]), 1), 2)
    DllCall("Wtsapi32.dll", "int", "WTSFreeMemory", "ptr", $aResult[4])
    Return $sUsername
EndFunc  ;==>_GetUsername
Avatar billede ejvindh Guru
19. april 2022 - 20:53 #2
Skal lige tilføjes, at jeg går ud fra, at du selv står inde for, at _GetUsername() giver dig det, som du ønsker. Da jeg ikke kører Windows, kan jeg nemlig ikke teste dette :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Stort CIO-interview: Lemvigh-Müllers milliard-omsætning er blevet digital