Jump to content

Ghost1987

Active Members
  • Posts

    34
  • Joined

  • Last visited

Ghost1987's Achievements

Seeker

Seeker (1/7)

0

Reputation

  1. :-Dhttp://www.robotronic.de/runasspc/ Name pronounces like this: runasSpc
  2. This script replaces runasspc (free for private use only) software. I express my gratitude to trancexx for his SHA1ForFile function and Matthew Robinson (SkinnyWhiteGuy) for his Blowfish related encryption functions. Wouldn't have been able to finish this script without those functions. #cs ------------------------------------------------------------------------------- AutoIt Version: 3.3.0.0 Authors: EncryptedRunAs - Serj (Ghost_1987) _SHA1ForFile function - trancexx Blowfish related functions - Matthew Robinson (SkinnyWhiteGuy) Script Function: EncryptedRunAs. #ce ------------------------------------------------------------------------------- #NoTrayIcon ; #RequireAdmin #include <Array.au3> #include <ComboConstants.au3> #include <Constants.au3> #include <EditConstants.au3> #include <File.au3> #include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> Opt("MustDeclareVars", 1) Opt("TrayMenuMode", 1) Local $aUserEnum = _NetUserEnum() If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage(), 30) Exit EndIf Local $sUserEnum = _ArrayToString($aUserEnum, "|", 1, $aUserEnum[0]+1) Global $key = DriveGetSerial(@HomeDrive) If @error Then MsgBox(0, "Error", "Crypt key error!", 30) Exit EndIf Global CONST $EncryptedStringSeparator = ";*x*;" If $CmdLine[0] == 1 Then EncryptedRunAs($CmdLine[1]) ElseIf $CmdLine[0] == 0 Then GUI($sUserEnum) Else Exit EndIf Func GUI($sUserEnum) Local $hWnd = GUICreate("EncryptedRunAs Options:", 420, 420, -1, -1, $WS_CAPTION + $WS_SYSMENU + $WS_MINIMIZEBOX) GUICtrlCreateGroup("Application", 10, 5, 400, 137) GUICtrlCreateLabel("Path:", 20, 25, 80, 20) Local $AppPath_Input = GUICtrlCreateInput("", 90, 22, 284, 20, $ES_AUTOHSCROLL + $ES_READONLY) Local $Browse_Button = GUICtrlCreateButton("...", 378, 21, 22, 22) GUICtrlCreateLabel("Parameters:", 20, 55, 80, 20) Local $AppParameters_Input = GUICtrlCreateInput("", 90, 52, 284, 20, $ES_AUTOHSCROLL) Local $CMDHelp_Button = GUICtrlCreateButton("?", 378, 51, 22, 22) GUICtrlCreateLabel("Execute in:", 20, 85, 80, 20) Local $WorkingDir_Combo = GUICtrlCreateCombo("", 90, 82, 284, 100, $CBS_AUTOHSCROLL + $GUI_SS_DEFAULT_COMBO + $CBS_SORT + $CBS_DISABLENOSCROLL) GUICtrlSetData($WorkingDir_Combo, StringTrimRight(@UserProfileDir, StringLen(@UserName) + 1) & "|" & @UserProfileDir & "|" & @TempDir & "|" & @ProgramFilesDir & "|" & @CommonFilesDir & "|" & @WindowsDir & "|" & @SystemDir) Local $WorkingDir_Button = GUICtrlCreateButton("»", 378, 81, 22, 22) Local $SHA1_CheckBox = GUICtrlCreateCheckbox("SHA1:", 20, 113, 50, 20) Local $SHA1_Input = GUICtrlCreateInput("SHA1_Enabled", 90, 112, 284, 20, $ES_AUTOHSCROLL + $ES_READONLY) GUICtrlSetFont($SHA1_Input, 8, 2) GUICtrlSetState($SHA1_CheckBox, $GUI_CHECKED) Local $SHA1Refresh_Button = GUICtrlCreateButton("»", 378, 111, 22, 22) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("Authentication", 10, 145, 400, 109) GUICtrlCreateLabel("Login:", 20, 165, 50, 20) Local $Login_Combo = GUICtrlCreateCombo("", 90, 162, 284, 100) GUICtrlSetData($Login_Combo, $sUserEnum, @UserName) Local $LogonUserTest_Button = GUICtrlCreateButton("»", 378, 161, 22, 52) GUICtrlCreateLabel("Password:", 20, 195, 50, 20) Local $Password_Input = GUICtrlCreateInput("", 90, 192, 284, 20, $ES_PASSWORD + $ES_AUTOHSCROLL) GUICtrlCreateLabel("Logon:", 20, 225, 50, 20) Local $LogonFlag_Combo = GUICtrlCreateCombo("", 90, 222, 284, 100, $CBS_DROPDOWNLIST) GUICtrlSetData($LogonFlag_Combo, "Interactive logon with no profile.|Interactive logon with profile.", "Interactive logon with profile.") GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("Output", 10, 257, 400, 119) Local $Output_Edit = GUICtrlCreateEdit("Please input all data before encryption.", 20, 272, 380, 72, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY) Local $Shortcut_CheckBox = GUICtrlCreateCheckbox("Create shortcut to generated Crypt.key file", 20, 350, 340, 20) GUICtrlSetFont($Output_Edit, 9, 2) GUICtrlSetState($Shortcut_CheckBox, $GUI_CHECKED) GUICtrlCreateGroup("", -99, -99, 1, 1) Local $Open_Button = GUICtrlCreateButton("Open", 10, 384, 85, 27) Local $QuickSave_Button = GUICtrlCreateButton("Save", 105, 384, 85, 27) Local $Save_Button = GUICtrlCreateButton("...", 190, 384, 30, 27) Local $Test_Button = GUICtrlCreateButton("Test", 230, 384, 85, 27) Local $Quit_Button = GUICtrlCreateButton("Quit", 325, 384, 85, 27) GUICtrlSetState($QuickSave_Button, $GUI_DEFBUTTON) GUISetState(@SW_SHOW) While 1 Local $msg = GUIGetMsg(), $AppPath, $AppParameters, $WorkingDir, $UserName, $Password, $Logon_Combo_Flag, $SHA1_Flag, $AppSHA1, $CreateShortcut If $msg == $Browse_Button Then $SHA1_Flag = GUICtrlRead($SHA1_CheckBox) Local $BrowsePath = FileOpenDialog("Choose application to RunAs...", @WorkingDir & "\", "Programs (*.exe;*.com;*.cmd;*.bat)", 1 + 2, "", $hWnd) If @error Then GUICtrlSetData($Output_Edit, "No application was chosen!" & @CRLF) Else GUICtrlSetData($AppPath_Input, $BrowsePath) $WorkingDir = StripAppName($BrowsePath) GUICtrlSetData($WorkingDir_Combo, $WorkingDir, $WorkingDir) If $SHA1_Flag == 1 Then GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF) Local $aRetAppSHA1 = SHA1Wrapper($BrowsePath) GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0]) GUICtrlSetData($Output_Edit, $aRetAppSHA1[1]) Else GUICtrlSetData($SHA1_Input, "SHA1_Disabled") GUICtrlSetData($Output_Edit, "SHA1 hash disabled." & @CRLF) EndIf EndIf EndIf If $msg == $CMDHelp_Button Then $AppPath = GUICtrlRead($AppPath_Input) If FileExists($AppPath) == 1 Then Run(@ComSpec & " /k", @WorkingDir) EndIf If $msg == $WorkingDir_Button Then $AppPath = GUICtrlRead($AppPath_Input) $WorkingDir = StripAppName($AppPath) GUICtrlSetData($WorkingDir_Combo, $WorkingDir, $WorkingDir) EndIf If $msg == $SHA1_CheckBox Then $AppPath = GUICtrlRead($AppPath_Input) $SHA1_Flag = GUICtrlRead($SHA1_CheckBox) If $SHA1_Flag == 1 Then GUICtrlSetData($SHA1_Input, "SHA1_Enabled") GUICtrlSetData($Output_Edit, "SHA1 hash enabled." & @CRLF) If FileExists($AppPath) == 1 Then GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF) Local $aRetAppSHA1 = SHA1Wrapper($AppPath) GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0]) GUICtrlSetData($Output_Edit, $aRetAppSHA1[1]) EndIf Else GUICtrlSetData($SHA1_Input, "SHA1_Disabled") GUICtrlSetData($Output_Edit, "SHA1 hash disabled." & @CRLF) EndIf EndIf If $msg == $SHA1Refresh_Button Then $AppPath = GUICtrlRead($AppPath_Input) If FileExists($AppPath) == 1 Then GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF) Local $aRetAppSHA1 = SHA1Wrapper($AppPath) GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0]) GUICtrlSetData($Output_Edit, $aRetAppSHA1[1]) EndIf EndIf If $msg == $LogonUserTest_Button Then $UserName = GUICtrlRead($Login_Combo) $Password = GUICtrlRead($Password_Input) Local $LogonUser = _LogonUser($UserName, $Password) If @error Then GUICtrlSetData($Output_Edit, "LogonUser WinAPI function error." & @CRLF & "Authentication check is impossible." & @CRLF) ElseIf $LogonUser == True Then GUICtrlSetData($Output_Edit, "Authentication successful." & @CRLF) ElseIf $LogonUser == False Then GUICtrlSetData($Output_Edit, "Authentication failed." & @CRLF) EndIf EndIf If $msg == $Open_Button Then Local $OpenCryptFilePath = FileOpenDialog("Open Crypt.key file for EncryptedRunAs...", @WorkingDir & "\", "Crypt file (*.key)", 1 + 2, "", $hWnd) If @error Then GUICtrlSetData($Output_Edit, "No Crypt.key file was chosen!" & @CRLF) Else EncryptedRunAs($OpenCryptFilePath) EndIf EndIf If $msg == $Save_Button Or $msg == $QuickSave_Button Or $msg == $Test_Button Then $AppPath = GUICtrlRead($AppPath_Input) $AppParameters = GUICtrlRead($AppParameters_Input) $WorkingDir = GUICtrlRead($WorkingDir_Combo) $UserName = GUICtrlRead($Login_Combo) $Password = GUICtrlRead($Password_Input) $Logon_Combo_Flag = GUICtrlRead($LogonFlag_Combo) $SHA1_Flag = GUICtrlRead($SHA1_CheckBox) $AppSHA1 = GUICtrlRead($SHA1_Input) $CreateShortcut = GUICtrlRead($Shortcut_CheckBox) If $Logon_Combo_Flag == "Interactive logon with no profile." Then Local $Logon_Flag = 0 ElseIf $Logon_Combo_Flag == "Interactive logon with profile." Then Local $Logon_Flag = 1 EndIf If FileExists($AppPath) == 1 And $AppSHA1 <> "SHA1_Failed" And FileExists($WorkingDir) == 1 Then Local $EncryptedString = StringToBinary(_Blowfish($key, $AppPath & $EncryptedStringSeparator & $AppParameters & $EncryptedStringSeparator & $WorkingDir & $EncryptedStringSeparator & $UserName & $EncryptedStringSeparator & $Password & $EncryptedStringSeparator & $Logon_Flag & $EncryptedStringSeparator & $AppSHA1, 0)) If $msg == $Save_Button Then Local $CryptFileSavePath = FileSaveDialog("Choose name and location for crypt file...", $AppPath, "Encrypted key (*.key)", 2 + 16, "crypt.key", $hWnd) If @error <> 1 Then Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, $CryptFileSavePath, $EncryptedString, $CreateShortcut, $hWnd) GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet) Else GUICtrlSetData($Output_Edit, "Crypt file save cancelled." & @CRLF) EndIf EndIf If $msg == $QuickSave_Button Then Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, 0, $EncryptedString, $CreateShortcut, $hWnd) GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet) EndIf If $msg == $Test_Button Then $CreateShortcut = 0 Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, @TempDir & '\crypt.key', $EncryptedString, $CreateShortcut, $hWnd) GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet) Local $EncryptedRunAsRet = EncryptedRunAs(@TempDir & '\crypt.key') If $EncryptedRunAsRet == True Then GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Test-run successful." & @CRLF) Else GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Test-run failed." & @CRLF) EndIf FileDelete(@TempDir & '\crypt.key') WinActivate($hWnd) EndIf Else Local $errmsg = "" If FileExists($AppPath) == 0 Then $errmsg &= "Specified file does not exist." & @CRLF If FileExists($WorkingDir) == 0 Then $errmsg &= "Specified working directory does not exist." & @CRLF If $AppSHA1 == "SHA1_Failed" Then $errmsg &= "SHA1 hash computation failed." & @CRLF & "Please disable SHA1 hash computation!" & @CRLF GUICtrlSetData($Output_Edit, $errmsg) EndIf Local $LogonUser = _LogonUser($UserName, $Password) If @error Then GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "LogonUser WinAPI function error." & @CRLF & "Authentication check is impossible." & @CRLF) ElseIf $LogonUser == True Then GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Authentication successful." & @CRLF) ElseIf $LogonUser == False Then GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Authentication failed." & @CRLF) EndIf EndIf If $msg == $Quit_Button Or $msg == $GUI_EVENT_CLOSE Then Exit WEnd GUIDelete() EndFunc ;GUI Func SHA1Wrapper($AppPath) Local $hTimer = TimerInit() Local $AppSHA1 = _SHA1ForFile($AppPath) Local $aRet[2] If @error Then $aRet[0] = "SHA1_Failed" $aRet[1] = "SHA1 hash computation failed." & @CRLF SetError(1) Return $aRet Else Local $iTimer = TimerDiff($hTimer) $aRet[0] = $AppSHA1 $aRet[1] = "SHA1 hash computation completed successfully." & @CRLF & "SHA1 took " & $iTimer & " ms" & @CRLF SetError(0) Return $aRet EndIf EndFunc ;SHA1Wrapper Func StripAppName($AppPath) Dim $szDrive, $szDir, $szFName, $szExt Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt) If FileExists($aPathRet[2]) == 0 Then Return @TempDir Else Return $aPathRet[1] & $aPathRet[2] EndIf EndFunc ;StripAppName Func GetAppName($AppPath) Dim $szDrive, $szDir, $szFName, $szExt Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt) If IsArray($aPathRet) Then Return $aPathRet[3] Else Return "AppName" EndIf EndFunc ;GetAppName Func GetAppExtension($AppPath) Dim $szDrive, $szDir, $szFName, $szExt Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt) If IsArray($aPathRet) Then Return $aPathRet[4] Else Return "" EndIf EndFunc ;GetAppExtension Func SaveCryptKeyFile($AppPath, $CryptFileSavePath, $EncryptedString, $CreateShortcut, $hWnd) Local $sRet If $CryptFileSavePath == 0 Then $CryptFileSavePath = StripAppName($AppPath) & 'crypt.key' Endif Local $CryptFileOpenTest = FileOpen($CryptFileSavePath, 16 + 2) If $CryptFileOpenTest = -1 Then $sRet &= "Unable to create crypt file." & @CRLF Else FileWrite($CryptFileOpenTest, $EncryptedString) If @error Then $sRet &= "File cannot be written to." & @CRLF EndIf FileClose($CryptFileOpenTest) If $CreateShortcut == 1 Then Local $AppExtension = GetAppExtension($AppPath) If $AppExtension == ".exe" Then Local $IconPath = $AppPath Local $IconIndex = 0 Else Local $IconPath = @SystemDir & "\shell32.dll" Local $IconIndex = 2 EndIf Local $ShortcutSavePath = FileSaveDialog("Choose name and location for shortcut...", @DesktopDir, "Shortcut (*.lnk)", 2 + 16, GetAppName($AppPath) & ".lnk", $hWnd) If @error Then $sRet &= "Shortcut creation canceled." & @CRLF Else If @Compiled == 0 Then Local $ShortcutArgs = '"' & @ScriptFullPath & '" "' & $CryptFileSavePath & '"' ElseIf @Compiled == 1 Then Local $ShortcutArgs = '"' & $CryptFileSavePath & '"' EndIf FileCreateShortcut(@AutoItExe, $ShortcutSavePath, @ScriptDir, $ShortcutArgs, "", $IconPath, "", $IconIndex, @SW_SHOWNORMAL) If @error Then $sRet &= "Shortcut creation failed." & @CRLF EndIf If FileExists($ShortcutSavePath) == 1 Then $sRet &= "Shortcut created successfully." & @CRLF EndIf EndIf EndIf If FileExists($CryptFileSavePath) == 1 Then $sRet &= "Crypt file created successfully." & @CRLF Return $sRet EndFunc ;SaveCryptKeyFile Func EncryptedRunAs($CryptFilePath) Local $CryptFileOpenTest = FileOpen($CryptFilePath, 16) If $CryptFileOpenTest = -1 Then MsgBox(0, "Error", "Unable to open crypt file.", 30) Return False Exit Else Local $EncryptedString = FileRead($CryptFileOpenTest) If @error Then MsgBox(0, "Error", "File cannot be opened in read mode.", 30) Return False Exit EndIf FileClose($CryptFileOpenTest) Local $DecryptedString = _Blowfish($key, BinaryToString($EncryptedString), 1) Local $DecryptedArray = StringSplit($DecryptedString, $EncryptedStringSeparator, 1) If $DecryptedArray[0] == 7 Then Local $AppPath = $DecryptedArray[1] Local $AppParameters = $DecryptedArray[2] Local $WorkingDir = $DecryptedArray[3] Local $UserName = $DecryptedArray[4] Local $Password = $DecryptedArray[5] Local $Logon_Flag = $DecryptedArray[6] Local $AppSHA1Str = $DecryptedArray[7] If $AppParameters == "" Then Local $AppPathANDParameters = $AppPath Else Local $AppPathANDParameters = $AppPath & " " & $AppParameters EndIf If $AppSHA1Str == "SHA1_Disabled" Then RunAs($UserName, @ComputerName, $Password, $Logon_Flag, $AppPathANDParameters, $WorkingDir) If @error Then MsgBox(0, "Error", "RunAs failed:" & @CRLF & @TAB & _WinAPI_GetLastErrorMessage(), 30) Return False Exit EndIf Else Local $AppSHA1Gen = _SHA1ForFile($AppPath) If @error Then MsgBox(0, "Error", "SHA1 hash computation failed.", 30) Return False Exit EndIf If $AppSHA1Str == $AppSHA1Gen Then RunAs($UserName, @ComputerName, $Password, $Logon_Flag, $AppPathANDParameters, $WorkingDir) If @error Then MsgBox(0, "Error", "RunAs failed:" & @CRLF & @TAB & _WinAPI_GetLastErrorMessage(), 30) Return False Exit EndIf Else MsgBox(0, "Error", "File integrity check failed." & @CRLF & "SHA1 file hash is diffrent from encoded in crypt file.", 30) Return False Exit EndIf EndIf Else MsgBox(0, "Error", "Decryption failed. Error in crypt file integrity.", 30) Return False Exit EndIf EndIf Return True EndFunc ;EncryptedRunAs Func _NetUserEnum($sServer = "") ; array[0] contains number of elements Local $tBufPtr = DllStructCreate("ptr") Local $tEntriesRead = DllStructCreate("dword") Local $tTotalEntries = DllStructCreate("dword") Local $aRet = DllCall("Netapi32.dll", "int", "NetUserEnum", "wstr", $sServer, "dword", 1, "dword", 2, "ptr", DllStructGetPtr($tBufPtr), "dword", -1, "ptr", DllStructGetPtr($tEntriesRead), "ptr", DllStructGetPtr($tTotalEntries), "ptr", 0 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Local Const $UF_ACCOUNTDISABLE = 0x2 Local $iEntriesRead = DllStructGetData($tEntriesRead,1) Local $pBuf = DllStructGetData($tBufPtr,1) Local $aUserEnum[1] = [0] Local $sUserInfo1 = "ptr;ptr;dword;dword;ptr;ptr;dword;ptr" Local $tUserInfo1 = DllStructCreate ($sUserInfo1) Local $zUserInfo1 = DllStructGetSize($tUserInfo1) For $i=1 To $iEntriesRead $tUserInfo1 = DllStructCreate($sUserInfo1, $pBuf+($i-1)*$zUserInfo1) Local $tName = DllStructCreate("wchar[256]", DllStructGetData($tUserInfo1,1)) Local $tFlag = DllStructGetData($tUserInfo1,7) If BitAnd($tFlag, $UF_ACCOUNTDISABLE)=0 Then $aUserEnum[0] += 1 ReDim $aUserEnum[$aUserEnum[0]+1] $aUserEnum[$aUserEnum[0]] = DllStructGetData($tName,1) EndIf Next DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf) Return $aUserEnum EndFunc ;_NetUserEnum Func _LogonUser($sUsername, $sPassword, $sServer = '.') ; Returns True if user exists Local $stToken = DllStructCreate("int") Local $aRet = DllCall("advapi32.dll", "int", "LogonUser", _ "str", $sUsername, "str", $sServer, "str", $sPassword, "dword", 3, "dword", 0, "ptr", DllStructGetPtr($stToken)) ; Local $hToken = DllStructGetData($stToken, 1) If @error Then Local $ErrorMsg = _WinAPI_GetLastErrorMessage() Return SetError(1, @error, $ErrorMsg) ElseIf $aRet[0] <> 0 Then Return True ElseIf $aRet[0] == 0 Then Return False EndIf EndFunc ;_LogonUser Func _Blowfish($key, $message, $decrypt) Local $i, $m, $len Local $xl, $xr, $result, $fill If IsDeclared("P") <> 1 Or IsDeclared("S") <> 1 Or IsDeclared("Gkey") <> 1 Then Global $P[18] Global $S[4][256] Global $Gkey = $key _BlowFish_Init($P, $S, $Gkey) ElseIf Not ($Gkey == $key) Then Global $P[18] Global $S[4][256] Global $Gkey = $key _BlowFish_Init($P, $S, $Gkey) EndIf If $decrypt == 0 Then $fill = 8 If Mod(StringLen($message), 8) <> 0 Then $fill = 8 - Mod(StringLen($message), 8) EndIf For $i = 1 To $fill $message &= Chr($fill) Next EndIf $len = StringLen($message) While $m < $len $xl = StringMid($message, $m + 1, 4) $xr = StringMid($message, $m + 5, 4) $m += 8 $xl = BitOR(BitShift(Asc(StringMid($xl, 1, 1)), -24), BitShift(Asc(StringMid($xl, 2, 1)), -16), BitShift(Asc(StringMid($xl, 3, 1)), -8), Asc(StringMid($xl, 4, 1))) $xr = BitOR(BitShift(Asc(StringMid($xr, 1, 1)), -24), BitShift(Asc(StringMid($xr, 2, 1)), -16), BitShift(Asc(StringMid($xr, 3, 1)), -8), Asc(StringMid($xr, 4, 1))) If $decrypt == 0 Then _BlowFish_Save($P, $S, $xl, $xr) Else _BlowFish_Decrypt($P, $S, $xl, $xr) EndIf $result &= Chr(BitAND(BitShift($xl, 24), 0xFF)) $result &= Chr(BitAND(BitShift($xl, 16), 0xFF)) $result &= Chr(BitAND(BitShift($xl, 8), 0xFF)) $result &= Chr(BitAND($xl, 0xFF)) $result &= Chr(BitAND(BitShift($xr, 24), 0xFF)) $result &= Chr(BitAND(BitShift($xr, 16), 0xFF)) $result &= Chr(BitAND(BitShift($xr, 8), 0xFF)) $result &= Chr(BitAND($xr, 0xFF)) WEnd ; Strip Null Bytes from end of string (Are present if decrypting) If $decrypt == 1 Then $fill = Asc(StringRight($result, 1)) $result = StringTrimRight($result, $fill) EndIf Return $result EndFunc ;_Blowfish Func _BlowFish_Init(ByRef $P, ByRef $S, $key) Local $ORIG_P[18] = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b] Local $ORIG_S0[256] = [0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, _ 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, _ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, _ 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, _ 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, _ 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a] Local $ORIG_S1[256] = [0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, _ 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, _ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, _ 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, _ 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, _ 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7] Local $ORIG_S2[256] = [0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, _ 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, _ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, _ 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, _ 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, _ 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0] Local $ORIG_S3[256] = [0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, _ 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, _ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, _ 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, _ 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, _ 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6] Local $data, $datal, $datar Local $i, $j, $k, $keyLen = StringLen($key) For $j = 0 To 255 $S[0][$j] = $ORIG_S0[$j] Next For $j = 0 To 255 $S[1][$j] = $ORIG_S1[$j] Next For $j = 0 To 255 $S[2][$j] = $ORIG_S2[$j] Next For $j = 0 To 255 $S[3][$j] = $ORIG_S3[$j] Next $j = 0 For $i = 0 To 17 $data = 0x00000000 For $k = 0 To 3 $data = BitOR(BitShift($data, -8), Asc(StringMid($key, $j + 1, 1))) $j += 1 If $j >= $keyLen Then $j = 0 EndIf Next $P[$i] = BitXOR($ORIG_P[$i], $data) Next $datal = 0x00000000 $datar = 0x00000000 For $i = 0 To 17 Step 2 _BlowFish_Save($P, $S, $datal, $datar) $P[$i] = $datal $P[$i + 1] = $datar Next For $i = 0 To 3 For $j = 0 To 255 Step 2 _BlowFish_Save($P, $S, $datal, $datar) $S[$i][$j] = $datal $S[$i][$j + 1] = $datar Next Next Return 0 EndFunc ;_BlowFish_Init Func _BlowFish_Save(ByRef $P, ByRef $S, ByRef $xl, ByRef $xr) ; Encode Each 64 Bit part of Message seperately Local $datal, $datar, $temp, $i $datal = $xl $datar = $xr For $i = 0 To 15 $datal = BitXOR($datal, $P[$i]) $datar = BitXOR($datar, F($S, $datal)) $temp = $datal $datal = $datar $datar = $temp Next $temp = $datal $datal = $datar $datar = $temp $datar = BitXOR($datar, $P[16]) $datal = BitXOR($datal, $P[17]) $xl = $datal $xr = $datar EndFunc ;_BlowFish_Save Func _BlowFish_Decrypt(ByRef $P, ByRef $S, ByRef $xl, ByRef $xr) ; Decode Each 64 Bit part of Message seperately Local $datal, $datar, $temp, $i $datal = $xl $datar = $xr For $i = 17 To 2 Step - 1 $datal = BitXOR($datal, $P[$i]) $datar = BitXOR($datar, F($S, $datal)) $temp = $datal $datal = $datar $datar = $temp Next $temp = $datal $datal = $datar $datar = $temp $datar = BitXOR($datar, $P[1]) $datal = BitXOR($datal, $P[0]) $xl = $datal $xr = $datar EndFunc ;_BlowFish_Decrypt Func F($S, $x) Local $a, $b, $c, $d, $y $d = BitAND($x, 0xFF) $x = BitShift($x, 8) $c = BitAND($x, 0xFF) $x = BitShift($x, 8) $b = BitAND($x, 0xFF) $x = BitShift($x, 8) $a = BitAND($x, 0xFF) $y = $S[0][$a] + $S[1][$b] $y = BitXOR($y, $S[2][$c]) $y += $S[3][$d] Return $y EndFunc ;_F Func _SHA1ForFile($sFile) Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", "wstr", $sFile, "dword", 0x80000000, "dword", 3, "ptr", 0, "dword", 3, "dword", 0, "ptr", 0) If @error Or $a_hCall[0] = -1 Then Return SetError(1, 0, "") EndIf Local $hFile = $a_hCall[0] $a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", "hwnd", $hFile, "dword", 0, "dword", 2, "dword", 0, "dword", 0, "ptr", 0) If @error Or Not $a_hCall[0] Then DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Return SetError(2, 0, "") EndIf DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Local $hFileMappingObject = $a_hCall[0] $a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", "hwnd", $hFileMappingObject, "dword", 4, "dword", 0, "dword", 0, "dword", 0) If @error Or Not $a_hCall[0] Then DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(3, 0, "") EndIf Local $pFile = $a_hCall[0] Local $iBufferSize = FileGetSize($sFile) Local $a_iCall = DllCall("advapi32.dll", "int", "CryptAcquireContext", "ptr*", 0, "ptr", 0, "ptr", 0, "dword", 1, "dword", 0xF0000000) If @error Or Not $a_iCall[0] Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(4, 0, "") EndIf Local $hContext = $a_iCall[1] $a_iCall = DllCall("advapi32.dll", "int", "CryptCreateHash", "ptr", $hContext, "dword", 0x00008004, "ptr", 0, "dword", 0, "ptr*", 0) If @error Or Not $a_iCall[0] Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0) Return SetError(5, 0, "") EndIf Local $hHashSHA1 = $a_iCall[5] $a_iCall = DllCall("advapi32.dll", "int", "CryptHashData", "ptr", $hHashSHA1, "ptr", $pFile, "dword", $iBufferSize, "dword", 0) If @error Or Not $a_iCall[0] Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1) DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0) Return SetError(6, 0, "") EndIf Local $tOutSHA1 = DllStructCreate("byte[20]") $a_iCall = DllCall("advapi32.dll", "int", "CryptGetHashParam", "ptr", $hHashSHA1, "dword", 2, "ptr", DllStructGetPtr($tOutSHA1), "dword*", 20, "dword", 0) If @error Or Not $a_iCall[0] Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1) DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0) Return SetError(7, 0, "") EndIf DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1) Local $sSHA1 = Hex(DllStructGetData($tOutSHA1, 1)) DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0) Return SetError(0, 0, $sSHA1) EndFunc ;_SHA1ForFile Any comments or suggestions for improvement are welcomed. Tested on Windows 2000 SP4, Windows XP SP3, Windows Vista SP1 (UAC - Disabled).
  3. If someone would provide this information: * Runas dialog caption (shell32.dll -> Dialog -> 1007 -> Caption) * Install as different user dialog caption (shell32.dll -> Dialog -> 1053 -> Caption) * Install new hardware dialog caption (newdev.dll -> String Table -> 133 -> 2123) I'll make English version of AdminTray script so more people could test it out on English version of WinXP.
  4. More script updates!
  5. I've updated scripts, AGAIN! Fixed some stupid bugs. Added some new functionality, cleaned code. Wrote comments to ease translation from Russian ;-) I would be very pleased if someone finds this scripts useful. Still waiting for comments, so please comment ;-).
  6. Use command line to delete user profile. DeleteProfile.au3 "UserName" If you plan to use this winapi function, be very careful, if $sProfilePath is NULL, it will delete whole %SystemDrive%. This behavior is very strange, because documentation states that if you pass NULL as ProfilePath, function will acquire ProfilePath from registry but this never occurs. #NoTrayIcon #include <Security.au3> If $CmdLine[0] == 1 Then Local $UserName = $CmdLine[1] Else Exit EndIf Local $aSID = _Security__LookupAccountName($UserName) If $aSID[2] == 1 Then Local $sProfilePath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" & $aSID[0], "ProfileImagePath") Local $aProfilePath = StringSplit($sProfilePath, '\', 0) $sProfilePath = "" For $i=1 to $aProfilePath[0] Local $EnvVarTestStart = StringMid($aProfilePath[$i], 1, 1) Local $EnvVarTestEnd = StringMid($aProfilePath[$i], StringLen($aProfilePath[$i]), 1) If $EnvVarTestStart == "%" And $EnvVarTestEnd == "%" Then $aProfilePath[$i] = StringTrimLeft($aProfilePath[$i], 1) $aProfilePath[$i] = StringTrimRight($aProfilePath[$i], 1) $aProfilePath[$i] = EnvGet($aProfilePath[$i]) EndIf $sProfilePath &= $aProfilePath[$i] & "\" Next $sProfilePath = StringTrimRight($sProfilePath, 1) If StringLen($sProfilePath) <> 0 Or $sProfilePath <> EnvGet("AllUsersProfile") Or $sProfilePath <> EnvGet("AppData") Or $sProfilePath <> EnvGet("CommonProgramFiles") Or $sProfilePath <> EnvGet("ProgramFiles") Or $sProfilePath <> EnvGet("SystemRoot") Or $sProfilePath <> EnvGet("SystemDrive") Then Local $aRet = _DeleteProfile($aSID[0], $sProfilePath, @ComputerName) Else Exit EndIf Else Exit EndIf Exit Func _DeleteProfile($sSID, $sProfilePath, $sComputerName) Local $aRet = DllCall("Userenv.dll", "int", "DeleteProfile", _ "str", $sSID, "str", $sProfilePath, "str", $sComputerName) If $aRet[0] <> 0 Then Return True Else Return False EndIf EndFunc ;_DeleteProfile
  7. This is another script on the same subject, MakeMeAdmin Tray Menu. I use this script at home and at work PC. It makes LUA on windows xp usable ;-). However this script won't work out of the box in Windows Xp other then Russian edition. Slight modification is needed. I am providing this script as it is, without needed modification so some one else can modify it for their windows version. I can't physically modify this script because I don't have access to PC with Windows XP English edition installed. But I'll help out with modification if some one will encounter any problems. #NoTrayIcon #RequireAdmin #include <Misc.au3> #include <Constants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <Security.au3> #include <Array.au3> #include <Process.au3> #include <WinAPI.au3> Opt("TrayMenuMode", 1) Opt("MustDeclareVars", 0) Opt("WinTitleMatchMode", 3) Opt("MouseCoordMode", 2) Global $sOccurenceName = "AdminTray", $UserName, $Password, $SplashTimerDiff, $SplashTimerInit, $_FuncTimerDiff, $_FuncTimerInit, $GroupSID = "S-1-5-32-544" ;Administrators [S-1-5-32-544] ;Users [S-1-5-32-545] ;Guests [S-1-5-32-546] ;Power Users [S-1-5-32-547] If _Singleton($sOccurenceName, 1) = 0 Then Msgbox(0,"Ошибка","Программа уже запущена!") ; Script is already running Exit EndIF Global $ExplorerPID = 0 Global $Dll = DllOpen("user32.dll") Global $GroupSID = "S-1-5-32-544", $Delay=500 Global $aLocalAdminGroupName = _Security__LookupAccountSid($GroupSID) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) Exit EndIf Global $aUserEnum = _NetUserEnum() If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) Exit EndIf Global $sUserEnum = _ArrayToString($aUserEnum, "|", 1, $aUserEnum[0]+1) Global $aCompSID = _Security__LookupAccountName(@ComputerName) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) Exit EndIf Global $LocalAdminName = _Security__LookupAccountSid($aCompSID[0] & "-500") If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) Exit EndIf GetAcctCredentials() TrayMenu() _terminate() Func GetAcctCredentials() Local $sUserEnumDefault = $aUserEnum[1] For $i = 1 to $aUserEnum[0] Step 1 If $aCompSID[2] == 3 Then Local $IsAdmin = _IsAdmin($aUserEnum[$i]) If $IsAdmin == False Then Local $sUserEnumDefault = $aUserEnum[$i] ExitLoop EndIf EndIf Next TraySetState(2) $hWnd = GUICreate("Настройки:", 220, 78, -1, -1, $WS_CAPTION + $WS_SYSMENU, $WS_EX_APPWINDOW + $WS_EX_TOPMOST) ; Setup GUICtrlCreateLabel("Логин:", 5, 7, 40, 20) $Combo_1 = GUICtrlCreateCombo("", 60, 5, 155, 20) GUICtrlSetData($Combo_1, $sUserEnum, $sUserEnumDefault) GUICtrlSetTip($Combo_1, "Логин пользователя") ; Login GUICtrlCreateLabel("Пароль:", 5, 30, 40, 20) ; Password $Input_1 = GUICtrlCreateInput("", 60, 28, 155, 20, $ES_PASSWORD + $ES_AUTOHSCROLL) GUICtrlSetTip($Input_1, "Пароль пользователя") ; Account password $Button_1 = GUICtrlCreateButton("Сохранить", 5, 51, 105, 23) ; Save $Button_2 = GUICtrlCreateButton("Выйти", 110, 51, 105, 23) ; Exit GUICtrlSetState($Input_1, $GUI_FOCUS) GUICtrlSetState($Button_1, $GUI_DEFBUTTON) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() $UserName = GUICtrlRead($Combo_1) $Password = GUICtrlRead($Input_1) If $msg = $Button_1 Then Local $IsAdmin = _IsAdmin($UserName) Local $CheckUserCredentials = _LogonUser($UserName,$Password) Local $msg = "" If $CheckUserCredentials == False Then $msg &= "Не верный логин/пароль." & @CR & "Пустые пароли не поддерживаются!" & @CR ; Incorrect Login/Password. Blank passwords are forbidden! GUICtrlSetData($Input_1, "") EndIf If $IsAdmin == True Then $msg &= "Указанный пользователь находится в локальной группе администраторов!" & @CR ; Specified account is member of local administrator group! GUICtrlSetData($Input_1, "") EndIf If $CheckUserCredentials == True And $IsAdmin == False Then ExitLoop MsgBox(0, "Ошибка", $msg, 0, $hWnd) EndIf If $msg = $Button_2 Or $msg = $GUI_EVENT_CLOSE Then Exit WEnd GUIDelete() TraySetState(1) EndFunc Func TrayMenu() $_FuncTimerInit = TimerInit() $explorer_menu = TrayCreateMenu("Проводник") ; Explorer $_ExplorerAdmin = TrayCreateItem("Мой компьютер", $explorer_menu) ; My Computer TrayItemSetState($_ExplorerAdmin, $TRAY_DEFAULT) $cpl = TrayCreateItem("Панель управления", $explorer_menu) ; Control Panel $_ExplorerAdminUserProfileDir = TrayCreateItem("Папка профилей", $explorer_menu) ; User profiles folder $_RestartShell = TrayCreateItem("Перезагрузить оболочку", $explorer_menu) ; Restart shell (explorer) $cpl_menu = TrayCreateMenu("Панель управления") ; Control Panel $appwiz = TrayCreateItem("Установка и удаление программ", $cpl_menu) ; Add/Remove programs $nusrmgr = TrayCreateItem("Учетные записи пользователей", $cpl_menu) ; User Accounts (nusrmgr) $firewall = TrayCreateItem("Брандмауэр Windows", $cpl_menu) ; Firewall $sysdm = TrayCreateItem("Свойства системы", $cpl_menu) ; System Properties $inetcpl = TrayCreateItem("Свойства обозревателя", $cpl_menu) ; IE Options $hdwwiz = TrayCreateItem("Установка оборудования", $cpl_menu) ; Add hardware wizard $timedate = TrayCreateItem("Дата и время", $cpl_menu) ; Date and Time $util_menu = TrayCreateMenu("Утилиты") ; Utilities $compmgmt = TrayCreateItem("Управление компьютером", $util_menu) ; Computer management TrayItemSetState($compmgmt, $TRAY_DEFAULT) $regedit = TrayCreateItem("Редактор реестра", $util_menu) ; Regedit $taskmgr = TrayCreateItem("Диспетчер задач (Win+Space)", $util_menu) ; Task manager $gpedit = TrayCreateItem("Групповая политика", $util_menu) ; Group policy editor $msconfig = TrayCreateItem("Настройка системы", $util_menu) ; MsConfig $msinfo32 = TrayCreateItem("Сведения о системе", $util_menu) ; MsInfo32 TrayCreateItem("") $exititem = TrayCreateItem("Выход (Ctrl+Shift+Backspace)") ; Exit TraySetState(1) TraySetClick(8) TraySetIcon(@ScriptDir & "\" & @ScriptName, 1) TraySetToolTip("Быстрый запуск с правами администратора") ; Quick launch with admin rights While 1 $msg = TrayGetMsg() HotKeySet("#{SPACE}", "_taskmgr") HotKeySet("^+{BS}", "_terminate") $_FuncTimerDiff = TimerDiff($_FuncTimerInit) If $_FuncTimerDiff > 50 Then _Func() $SplashTimerDiff = TimerDiff($SplashTimerInit) If $SplashTimerDiff > 4000 Then SplashOff() Select Case $msg = 0 ContinueLoop Case $msg = $cpl _ExplorerAdmin("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}") Case $msg = $appwiz _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl") Case $msg = $nusrmgr _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl") Case $msg = $firewall _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL firewall.cpl") Case $msg = $sysdm _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl") Case $msg = $inetcpl _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl") Case $msg = $hdwwiz _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL hdwwiz.cpl") Case $msg = $timedate _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\rundll32.exe shell32.dll,Control_RunDLL timedate.cpl") Case $msg = $compmgmt _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\mmc.exe compmgmt.msc /s") Case $msg = $regedit _MakeMeAdmin_RunAs($UserName, $Password, "regedit.exe") Case $msg = $taskmgr _taskmgr() Case $msg = $gpedit _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\mmc.exe gpedit.msc") Case $msg = $msconfig _MakeMeAdmin_RunAs($UserName, $Password, @WindowsDir & "\pchealth\helpctr\binaries\msconfig.exe") Case $msg = $msinfo32 _MakeMeAdmin_RunAs($UserName, $Password, @WindowsDir & "\pchealth\helpctr\binaries\HelpCtr.exe -mode hcp://system/sysinfo/msinfo.xml") Case $msg = $_ExplorerAdmin Or $msg = $TRAY_EVENT_PRIMARYDOWN _ExplorerAdmin("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") Case $msg = $_ExplorerAdminUserProfileDir _ExplorerAdmin("/SELECT," & @UserProfileDir) Case $msg = $_RestartShell _RestartShell() Case $msg = $exititem ExitLoop EndSelect WEnd EndFunc Func _Sleep($Delay) TraySetIcon(@SystemDir & "\shdocvw.dll", 112) TraySetClick(0) Sleep($Delay) TraySetClick(8) TraySetIcon(@ScriptDir & "\" & @ScriptName, 1) EndFunc ;_Sleep Func _taskmgr() _MakeMeAdmin_RunAs($UserName, $Password, @SystemDir & "\taskmgr.exe") EndFunc ;_taskmgr Func _ExplorerAdmin($_ExplorerAdminPath) $SplashTimerDiff = TimerDiff($SplashTimerInit) If $SplashTimerDiff > 4000 Then $SplashTimerInit = TimerInit() Local $iIndex = $GWL_EXSTYLE Local $iValue = $WS_EX_WINDOWEDGE + $WS_EX_TOPMOST + $WS_EX_TRANSPARENT Local $hWnd = SplashTextOn("", "Не забываем обновлять окно проводника!", 350, 24, -1, -1, 33) ; Don't forget to manually refresh explorer window _WinAPI_SetWindowLong($hWnd, $iIndex, $iValue) WinSetTrans($hWnd, "", 200) EndIf If _ProcessGetName($ExplorerPID) == "explorer.exe" Then _MakeMeAdmin_RunAs($UserName, $Password, "explorer.exe " & $_ExplorerAdminPath) Else $ExplorerPID = _MakeMeAdmin_RunAs($UserName, $Password, "explorer.exe /SEPARATE," & $_ExplorerAdminPath) EndIf EndFunc ;_ExplorerAdmin Func _KillExplorer() SplashOff() If _ProcessGetName($ExplorerPID) == "explorer.exe" Then ProcessClose($ExplorerPID) EndFunc ;_KillExplorer Func _RestartShell() _KillExplorer() ProcessClose("explorer.exe") EndFunc ;_RestartShell Func _terminate() DllClose($Dll) _KillExplorer() Exit EndFunc ;_terminate Func _Func() $_FuncTimerInit = TimerInit() Local $sWindowName_1 = "Запуск от имени другого пользователя" ; Runas dialog caption (shell32.dll -> Dialog -> 1007 -> Caption) Local $sWindowName_2 = "Установка программы от другого имени" ; Install as different user dialog caption (shell32.dll -> Dialog -> 1053 -> Caption) Local $sWindowName_3 = "Найдено новое оборудование" ; Install new hardware dialog caption (newdev.dll -> String Table -> 133 -> 2123) If WinExists($sWindowName_1) And WinActive($sWindowName_1) And _IsPressed("04", $Dll) Then Local $hWnd = WinGetHandle($sWindowName_1) Local $aMousePos = MouseGetPos() Local $aControlPos = ControlGetPos($hWnd, "", "Button5") If @error <> 1 And IsArray($aControlPos) And $aMousePos[0] >= $aControlPos[0] And $aMousePos[0] <= $aControlPos[0]+$aControlPos[2] And $aMousePos[1] >= $aControlPos[1] And $aMousePos[1] <= $aControlPos[1]+$aControlPos[3] Then WinSetState($hWnd, "", @SW_HIDE) _NetLocalGroupAddMember($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf _Sleep($Delay) ControlCommAnd($hWnd, "", "Button2", "UnCheck", "") ControlCommAnd($hWnd, "", "Button3", "Check", "") ControlDisable($hWnd, "", "ComboBox1") ControlSetText($hWnd, "", "Edit1", $UserName) ControlSetText($hWnd, "", "Edit2", $Password) ControlClick($hWnd, "", "Button5", "primary") _Sleep($Delay*3) _NetLocalGroupDelMembers($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf WinSetState($hWnd, "", @SW_SHOW) EndIf EndIf If WinExists($sWindowName_2) And WinActive($sWindowName_2) And _IsPressed("04", $Dll) Then Local $hWnd = WinGetHandle($sWindowName_2) Local $aMousePos = MouseGetPos() Local $aControlPos = ControlGetPos($hWnd, "", "Button6") If @error <> 1 And IsArray($aControlPos) And $aMousePos[0] >= $aControlPos[0] And $aMousePos[0] <= $aControlPos[0]+$aControlPos[2] And $aMousePos[1] >= $aControlPos[1] And $aMousePos[1] <= $aControlPos[1]+$aControlPos[3] Then WinSetState($hWnd, "", @SW_HIDE) _NetLocalGroupAddMember($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf _Sleep($Delay) ControlCommAnd($hWnd, "", "Button3", "Check", "") ControlDisable($hWnd, "", "ComboBox1") ControlSetText($hWnd, "", "Edit1", $UserName) ControlSetText($hWnd, "", "Edit2", $Password) ControlCommAnd($hWnd, "", "Button5", "UnCheck", "") ControlClick($hWnd, "", "Button6", "primary") _Sleep($Delay*3) _NetLocalGroupDelMembers($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf WinSetState($hWnd, "", @SW_SHOW) EndIF EndIf If WinExists($sWindowName_3) And WinActive($sWindowName_3) And _IsPressed("04", $Dll) Then Local $hWnd = WinGetHandle($sWindowName_3) Local $aMousePos = MouseGetPos() Local $aControlPos = ControlGetPos($hWnd, "", "Button2") If @error <> 1 And IsArray($aControlPos) And $aMousePos[0] >= $aControlPos[0] And $aMousePos[0] <= $aControlPos[0]+$aControlPos[2] And $aMousePos[1] >= $aControlPos[1] And $aMousePos[1] <= $aControlPos[1]+$aControlPos[3] Then WinSetState($hWnd, "", @SW_HIDE) _NetLocalGroupAddMember($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf _Sleep($Delay) ControlSetText($hWnd, "", "Edit2", $UserName) ControlSetText($hWnd, "", "Edit3", $Password) ControlClick($hWnd, "", "Button2", "primary") _Sleep($Delay*3) _NetLocalGroupDelMembers($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf WinSetState($hWnd, "", @SW_SHOW) EndIf EndIf EndFunc ;_Func Func _MakeMeAdmin_RunAs($UserName, $Password, $ExecPath) _NetLocalGroupAddMember($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf _Sleep($Delay) Local $PID = RunAs($UserName, @ComputerName, $Password, 0, $ExecPath) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf _Sleep($Delay*3) _NetLocalGroupDelMembers($UserName, $aLocalAdminGroupName[0]) If @error Then MsgBox(0, "Ошибка", _WinAPI_GetLastErrorMessage()) EndIf Return $PID EndFunc ;_MakeMeAdmin_RunAs Func _LogonUser($sUsername, $sPassword, $sServer = '.') ; Returns True if user exists $stToken = DllStructCreate("int") Local $aRet = DllCall("advapi32.dll", "int", "LogonUser", _ "str", $sUsername, "str", $sServer, "str", $sPassword, "dword", 3, "dword", 0, "ptr", DllStructGetPtr($stToken)) ;$hToken = DllStructGetData($stToken, 1) If Not @error And $aRet[0] <> 0 Then Return True EndIf Return False EndFunc ;_LogonUser Func _IsAdmin($UserName) Local $aLocalGroupNames = _NetUserGetLocalGroups($UserName) Local $ArraySearch = _ArraySearch($aLocalGroupNames, $aLocalAdminGroupName[0], 1) If $ArraySearch == -1 Then Return False Else Return True EndIf EndFunc ;_IsAdmin Func _NetLocalGroupAddMember($sUsername, $sGroup, $sServer = '') Local $twUser = DllStructCreate("wchar["& StringLen($sUsername)+1 &"]") Local $tpUser = DllStructCreate("ptr") DllStructSetData($twUser, 1, $sUsername) DllStructSetData($tpUser, 1, DllStructGetPtr($twUser)) Local $aRet = DllCall("netapi32.dll", "int", "NetLocalGroupAddMembers", "wstr", $sServer, "wstr", $sGroup, "int", 3, "ptr", DllStructGetPtr($tpUser), "int", 1 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Return True EndFunc ;_NetLocalGroupAddMember Func _NetLocalGroupDelMembers($sUsername, $sGroup, $sServer = '') Local $twUser = DllStructCreate("wchar["& StringLen($sUsername)+1 &"]") Local $tpUser = DllStructCreate("ptr") DllStructSetData($twUser, 1, $sUsername) DllStructSetData($tpUser, 1, DllStructGetPtr($twUser)) Local $aRet = DllCall("netapi32.dll", "int", "NetLocalGroupDelMembers", "wstr", $sServer, "wstr", $sGroup, "int", 3, "ptr", DllStructGetPtr($tpUser), "int", 1 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Return True EndFunc ;_NetLocalGroupDelMembers Func _NetUserEnum($sServer = "") ; array[0] contains number of elements Local $tBufPtr = DllStructCreate("ptr") Local $tEntriesRead = DllStructCreate("dword") Local $tTotalEntries = DllStructCreate("dword") Local $aRet = DllCall("Netapi32.dll", "int", "NetUserEnum", "wstr", $sServer, "dword", 1, "dword", 2, "ptr", DllStructGetPtr($tBufPtr), "dword", -1, "ptr", DllStructGetPtr($tEntriesRead), "ptr", DllStructGetPtr($tTotalEntries), "ptr", 0 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Local Const $UF_ACCOUNTDISABLE = 0x2 Local $iEntriesRead = DllStructGetData($tEntriesRead,1) Local $pBuf = DllStructGetData($tBufPtr,1) Local $aUserEnum[1] = [0] Local $sUserInfo1 = "ptr;ptr;dword;dword;ptr;ptr;dword;ptr" Local $tUserInfo1 = DllStructCreate ($sUserInfo1) Local $zUserInfo1 = DllStructGetSize($tUserInfo1) For $i=1 To $iEntriesRead $tUserInfo1 = DllStructCreate($sUserInfo1, $pBuf+($i-1)*$zUserInfo1) $tName = DllStructCreate("wchar[256]", DllStructGetData($tUserInfo1,1)) $tFlag = DllStructGetData($tUserInfo1,7) If BitAnd($tFlag, $UF_ACCOUNTDISABLE)=0 Then $aUserEnum[0] += 1 ReDim $aUserEnum[$aUserEnum[0]+1] $aUserEnum[$aUserEnum[0]] = DllStructGetData($tName,1) EndIf Next DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf) Return $aUserEnum EndFunc ;_NetUserEnum Func _NetUserGetLocalGroups($sUsername, $sServer = "") ; array[0] contains number of elements Local CONST $LG_INCLUDE_INDIRECT = 0x1 Local $tBufPtr = DllStructCreate("ptr") Local $ptBufPtr = DllStructGetPtr($tBufPtr) Local $tEntriesRead = DllStructCreate("dword") Local $ptEntriesRead = DllStructGetPtr($tEntriesRead) Local $tTotalEntries = DllStructCreate("dword") Local $ptTotalEntries = DllStructGetPtr($tTotalEntries) Local $aRet = DllCall("Netapi32.dll", "int", "NetUserGetLocalGroups", "wstr", $sServer, "wstr", $sUsername, "dword", 0, "dword", $LG_INCLUDE_INDIRECT, "ptr", $ptBufPtr, "dword", -1, "ptr", $ptEntriesRead, "ptr", $ptTotalEntries) If $aRet[0] Then Return SetError(1, $aRet[0], False) Local $iEntriesRead = DllStructGetData($tEntriesRead, 1) Local $pBuf = DllStructGetData($tBufPtr, 1) Local $sLocalGroupUsersInfo0 = "ptr" Local $tLocalGroupUsersInfo0 = DllStructCreate($sLocalGroupUsersInfo0) Local $zLocalGroupUsersInfo0 = DllStructGetSize($tLocalGroupUsersInfo0) Local $tLocalGroupName Local $aLocalGroupNames[1] = [0] For $i = 1 To $iEntriesRead $tLocalGroupUsersInfo0 = DllStructCreate($sLocalGroupUsersInfo0, $pBuf + ($i - 1) * $zLocalGroupUsersInfo0) $tLocalGroupName = DllStructCreate("wchar[256]", DllStructGetData($tLocalGroupUsersInfo0, 1)) $aLocalGroupNames[0] += 1 ReDim $aLocalGroupNames[$aLocalGroupNames[0]+1] $aLocalGroupNames[$aLocalGroupNames[0]] = DllStructGetData($tLocalGroupName,1) Next DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf) Return $aLocalGroupNames EndFunc ;_NetUserGetLocalGroups
  8. Please explain what exactly are you trying to achieve? You can just take out GUI related functions. This will require path, username, password specified manually. To lunch script with out admin privileges just remove #RequireAdmin from the script, but without these privileges script won't work! To hard code admin credentials you can make simple runas script and with it launch MakeMeAdmin.
  9. Well this is only for debugging, you can just comment out strings with this code If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) ; Exit EndIf But if you could specify where exactly you've encountered this MsgBox (after which instruction) I'll try to correct this. For some strange reason I've never encountered this Error message on my computer. I am using Windows XP SP3.
  10. Is it possible to combine combo control with List View, so when I click on combo box, pop up control will be 2 row List View just like in SampleControls script.
  11. You will need to use DllCall and use webkit api which is not written yet. Only viable solution for this moment is to use Qt Framework and to learn C++ or you could use Adobe AIR to make (webkit driven) rich Internet applications.
  12. By default Windows RunAs command and corresponding winapi can't be used with blank passwords it's a security feature so this is why the code above didn't validate user credentials with blank passwords. I am glad that I've helped someone ;-) I even didn't knew that LogonUser validates user accounts with blank passwords, if it actually does this is very good thing. By the way LogonUser approach of user account validation won't work on W2k, more info is on msdn
  13. Hmm... tnx storme, I've actually searched for LogonUser implementation before I've tried to write my own code, but couldn't find any examples, but today I had searched again and fount a thread you was talking about. I can see that I've missed data types "wstr" in my code should have been "str". This was a main reason for the problem. For better performance the above code should be modified, dwLogonType set to LOGON32_LOGON_NETWORK and not to LOGON32_LOGON_INTERACTIVE So modified code would be like this #NoTrayIcon Global $Ret = _LogonUser("user","user") MsgBox(64, "Debug", $Ret) Func _LogonUser($sUsername, $sPassword, $sServer = '.'); Returns True if user exists $stToken = DllStructCreate("int") Local $aRet = DllCall("advapi32.dll", "int", "LogonUser", _ "str", $sUsername, "str", $sServer, "str", $sPassword, "dword", 3, "dword", 0, "ptr", DllStructGetPtr($stToken)) ;$hToken = DllStructGetData($stToken, 1) If Not @error And $aRet[0] <> 0 Then Return True EndIf Return False EndFunc ;_LogonUser
  14. This script was inspired by Aaron Margosis "MakeMeAdmin.cmd" Good explanations why to use LUA (Limited user account) in windows can be found here, on nonamin. #NoTrayIcon #RequireAdmin #include <Security.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <Array.au3> #include <WinAPI.au3> ;Administrators [S-1-5-32-544] ;Users [S-1-5-32-545] ;Guests [S-1-5-32-546] ;Power Users [S-1-5-32-547] Global $GroupSID = "S-1-5-32-544", $Delay=100 Global $aLocalAdminGroupName = _Security__LookupAccountSid($GroupSID) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) Exit EndIf Global $aUserEnum = _NetUserEnum() If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) ; Exit EndIf Global $sUserEnum = _ArrayToString($aUserEnum, "|", 1, $aUserEnum[0]+1) Global $aCompSID = _Security__LookupAccountName(@ComputerName) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) ; Exit EndIf Global $LocalAdminName = _Security__LookupAccountSid($aCompSID[0] & "-500") If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) ; Exit EndIf For $i = 1 to $aUserEnum[0]+1 Step 1 If $aCompSID[2] == 3 Then Local $IsAdmin = _IsAdmin($aUserEnum[$i]) If $IsAdmin == False Then $sUserEnumDefault = $aUserEnum[$i] ExitLoop EndIf Else $sUserEnumDefault = $aUserEnum[1] ExitLoop EndIf Next GUI($sUserEnum, $sUserEnumDefault) Exit Func GUI($sUserEnum, $sUserEnumDefault) Dim $aApplications[9] $aApplications[0] = "explorer.exe /SEPARATE,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}" $aApplications[1] = "regedit" $aApplications[2] = "explorer /SEPARATE,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" $aApplications[3] = "mmc.exe compmgmt.msc /s" $aApplications[4] = "cmd.exe" $aApplications[5] = "mmc.exe gpedit.msc" $aApplications[6] = @WindowsDir & "\pchealth\helpctr\binaries\msconfig.exe" $aApplications[7] = @CommonFilesDir & "\Microsoft Shared\MSInfo\msinfo32.exe" $aApplications[8] = "taskmgr.exe" Local $sApplications = _ArrayToString($aApplications, "|") Local $Delay=100 If $CmdLine[0] == 0 And IsAdmin() == 1 Then $hwnd = GUICreate("MakeMeAdmin", 290, 130, -1, -1, $WS_CAPTION + $WS_SYSMENU, $WS_EX_APPWINDOW + $WS_EX_TOPMOST) GUICtrlCreateLabel("Path:", 5, 8, 60, 20) $Combo_2 = GUICtrlCreateCombo("", 60, 5, 200, 20) GUICtrlSetData($Combo_2, $sApplications) $Button_1 = GUICtrlCreateButton("...", 265, 5, 20, 20) GUICtrlCreateLabel("Username:", 5, 33, 60, 20) $Combo_1 = GUICtrlCreateCombo("", 60, 30, 200, 20) GUICtrlSetData($Combo_1, $sUserEnum, $sUserEnumDefault) GUICtrlCreateLabel("Password:", 5, 58, 60, 20) $Input_1 = GUICtrlCreateInput("", 60, 55, 200, 20, $ES_PASSWORD + $ES_AUTOHSCROLL) GUICtrlCreateLabel("Delay:", 5, 83, 60, 20) $Input_2 = GUICtrlCreateInput("100", 60, 80, 50, 20) GUICtrlCreateLabel("time to wait (in ms)", 115, 83, 120, 20) GUICtrlSetLimit($Input_2, 4) $UpDown_1 = GUICtrlCreateUpdown($Input_2) GUICtrlSetLimit($UpDown_1, 9999, 100) $Button_2 = GUICtrlCreateButton("OK", 5, 105, 140, 20) $Button_3 = GUICtrlCreateButton("Exit", 145, 105, 140, 20) $Button_4 = GUICtrlCreateButton("?", 265, 80, 20, 20) GUICtrlSetState($Button_1, $GUI_DEFBUTTON + $GUI_FOCUS) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() $UserName = GUICtrlRead($Combo_1) $Password = GUICtrlRead($Input_1) $Delay = GUICtrlRead($Input_2) $Path = GUICtrlRead($Combo_2) If $msg = $Button_2 Then Local $IsAdmin = _IsAdmin($UserName) Local $CheckUserCredentials = _LogonUser($UserName,$Password) Local $msg = "" If $CheckUserCredentials == False Then $msg &= "Incorrect Login/Password." & @CR & "Blank passwords are forbidden!" & @CR GUICtrlSetData($Input_1, "") EndIf If $IsAdmin == True Then $msg &= "Specified account is member of local administrator group!" & @CR GUICtrlSetData($Input_1, "") EndIf If $CheckUserCredentials == True And $IsAdmin == False Then ExitLoop MsgBox(0, "Error!", $msg, 0, $hwnd) EndIf If $msg = $GUI_EVENT_CLOSE Or $msg = $Button_3 Then Exit If $msg = $Button_4 Then MsgBox(0, "MakeMeAdmin", "Script requires Administrator privileges" & @CR & "made by Serj (Ghost_1987@inbox.ru)", 0, $hwnd) EndIf If $msg = $Button_1 Then $Path = FileOpenDialog("Browse", @ScriptDir & "\", "Applications (*.exe)", 1 + 2) If @error == 1 Then MsgBox(0,"Error!","No File(s) chosen", 0, $hwnd) ElseIf @error == 0 Then GUICtrlSetData($Combo_2, $Path) GUICtrlSetState($Input_1, $GUI_FOCUS) GUICtrlSetState($Button_2, $GUI_DEFBUTTON) EndIf EndIf If $msg = $Combo_2 Then GUICtrlSetState($Input_1, $GUI_FOCUS) GUICtrlSetState($Button_2, $GUI_DEFBUTTON) EndIf WEnd GUIDelete() _Main($UserName, $Password, $Path, $Delay) Else MsgBox(0, "MakeMeAdmin", "Script requires Administrator privileges" & @CR & "made by Serj (Ghost_1987@inbox.ru)") Exit EndIf EndFunc ;GUI Func _Main($UserName, $Password, $Path, $Delay) Local $aLocalGroupNames = _NetUserGetLocalGroups($UserName) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) Exit EndIf _ArraySearch($aLocalGroupNames, $LocalAdminGroupName[0], 1) If @error Then If $Delay < 100 Then $Delay = 100 _NetLocalGroupAddMember($UserName, $LocalAdminGroupName[0]) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) Exit EndIf Sleep ($Delay) RunAs($UserName, @ComputerName, $Password, 0, $Path) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) Exit EndIf Sleep ($Delay) _NetLocalGroupDelMembers($UserName, $LocalAdminGroupName[0]) If @error Then MsgBox(0, "Error", _WinAPI_GetLastErrorMessage()) Exit EndIf Else MsgBox(0, "Error", "Specified account already in local administrator group!") EndIf EndFunc ;_Main Func _NetLocalGroupAddMember($sUsername, $sGroup, $sServer = '') Local $twUser = DllStructCreate("wchar["& StringLen($sUsername)+1 &"]") Local $tpUser = DllStructCreate("ptr") DllStructSetData($twUser, 1, $sUsername) DllStructSetData($tpUser, 1, DllStructGetPtr($twUser)) Local $aRet = DllCall("netapi32.dll", "int", "NetLocalGroupAddMembers", "wstr", $sServer, "wstr", $sGroup, "int", 3, "ptr", DllStructGetPtr($tpUser), "int", 1 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Return True EndFunc ;_NetLocalGroupAddMember Func _NetLocalGroupDelMembers($sUsername, $sGroup, $sServer = '') Local $twUser = DllStructCreate("wchar["& StringLen($sUsername)+1 &"]") Local $tpUser = DllStructCreate("ptr") DllStructSetData($twUser, 1, $sUsername) DllStructSetData($tpUser, 1, DllStructGetPtr($twUser)) Local $aRet = DllCall("netapi32.dll", "int", "NetLocalGroupDelMembers", "wstr", $sServer, "wstr", $sGroup, "int", 3, "ptr", DllStructGetPtr($tpUser), "int", 1 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Return True EndFunc ;_NetLocalGroupDelMembers Func _NetUserEnum($sServer = "") ; array[0] contains number of elements Local $tBufPtr = DllStructCreate("ptr") Local $tEntriesRead = DllStructCreate("dword") Local $tTotalEntries = DllStructCreate("dword") Local $aRet = DllCall("Netapi32.dll", "int", "NetUserEnum", "wstr", $sServer, "dword", 1, "dword", 2, "ptr", DllStructGetPtr($tBufPtr), "dword", -1, "ptr", DllStructGetPtr($tEntriesRead), "ptr", DllStructGetPtr($tTotalEntries), "ptr", 0 ) If $aRet[0] Then Return SetError(1, $aRet[0], False) Local Const $UF_ACCOUNTDISABLE = 0x2 Local $iEntriesRead = DllStructGetData($tEntriesRead,1) Local $pBuf = DllStructGetData($tBufPtr,1) Local $aUserEnum[1] = [0] Local $sUserInfo1 = "ptr;ptr;dword;dword;ptr;ptr;dword;ptr" Local $tUserInfo1 = DllStructCreate ($sUserInfo1) Local $zUserInfo1 = DllStructGetSize($tUserInfo1) For $i=1 To $iEntriesRead $tUserInfo1 = DllStructCreate($sUserInfo1, $pBuf+($i-1)*$zUserInfo1) $tName = DllStructCreate("wchar[256]", DllStructGetData($tUserInfo1,1)) $tFlag = DllStructGetData($tUserInfo1,7) If BitAnd($tFlag, $UF_ACCOUNTDISABLE)=0 Then $aUserEnum[0] += 1 ReDim $aUserEnum[$aUserEnum[0]+1] $aUserEnum[$aUserEnum[0]] = DllStructGetData($tName,1) EndIf Next DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf) Return $aUserEnum EndFunc ;_NetUserEnum Func _NetUserGetLocalGroups($sUsername, $sServer = "") ; array[0] contains number of elements Local CONST $LG_INCLUDE_INDIRECT = 0x1 Local $tBufPtr = DllStructCreate("ptr") Local $ptBufPtr = DllStructGetPtr($tBufPtr) Local $tEntriesRead = DllStructCreate("dword") Local $ptEntriesRead = DllStructGetPtr($tEntriesRead) Local $tTotalEntries = DllStructCreate("dword") Local $ptTotalEntries = DllStructGetPtr($tTotalEntries) Local $aRet = DllCall("Netapi32.dll", "int", "NetUserGetLocalGroups", "wstr", $sServer, "wstr", $sUsername, "dword", 0, "dword", $LG_INCLUDE_INDIRECT, "ptr", $ptBufPtr, "dword", -1, "ptr", $ptEntriesRead, "ptr", $ptTotalEntries) If $aRet[0] Then Return SetError(1, $aRet[0], False) Local $iEntriesRead = DllStructGetData($tEntriesRead, 1) Local $pBuf = DllStructGetData($tBufPtr, 1) Local $sLocalGroupUsersInfo0 = "ptr" Local $tLocalGroupUsersInfo0 = DllStructCreate($sLocalGroupUsersInfo0) Local $zLocalGroupUsersInfo0 = DllStructGetSize($tLocalGroupUsersInfo0) Local $tLocalGroupName Local $aLocalGroupNames[1] = [0] For $i = 1 To $iEntriesRead $tLocalGroupUsersInfo0 = DllStructCreate($sLocalGroupUsersInfo0, $pBuf + ($i - 1) * $zLocalGroupUsersInfo0) $tLocalGroupName = DllStructCreate("wchar[256]", DllStructGetData($tLocalGroupUsersInfo0, 1)) $aLocalGroupNames[0] += 1 ReDim $aLocalGroupNames[$aLocalGroupNames[0]+1] $aLocalGroupNames[$aLocalGroupNames[0]] = DllStructGetData($tLocalGroupName,1) Next DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf) Return $aLocalGroupNames EndFunc ;_NetUserGetLocalGroups Func _LogonUser($sUsername, $sPassword, $sServer = '.') ; Returns True if user exists $stToken = DllStructCreate("int") Local $aRet = DllCall("advapi32.dll", "int", "LogonUser", _ "str", $sUsername, "str", $sServer, "str", $sPassword, "dword", 3, "dword", 0, "ptr", DllStructGetPtr($stToken)) ;$hToken = DllStructGetData($stToken, 1) If Not @error And $aRet[0] <> 0 Then Return True EndIf Return False EndFunc ;_LogonUser Func _IsAdmin($UserName) Local $aLocalGroupNames = _NetUserGetLocalGroups($UserName) Local $ArraySearch = _ArraySearch($aLocalGroupNames, $aLocalAdminGroupName[0], 1) If $ArraySearch == -1 Then Return False Else Return True EndIf EndFunc ;_IsAdmin Any suggestion for code improvement are welcomed. Please post your comments, I would like to here what people think of this script. P.S. PM me, if I won't respond for to long.
×
×
  • Create New...