; Pass variables to isUiAccess and AsUser to get SendSAS result. ; If you using external UiAccess class pass it instanse to UIA argument SendSAS(ByRef isUiAccess := 0, ByRef AsUser := 0, _UIA := 0) { SysGet, isRdp, 4096 ; SM_REMOTESESSION if (isRdp) { ;try ShellDispatch4 := ComObjCreate("{13709620-C279-11CE-A49E-444553540000}", "{efd84b2d-4bcf-4298-be25-eb542a59fbda}") ;if (ShellDispatch4) { ; DllCall(NumGet(NumGet(ShellDispatch4+0)+40*A_PtrSize), "Ptr", ShellDispatch4) ; ObjRelease(ShellDispatch4) ;} return ComObjCreate("Shell.Application").WindowsSecurity } _isUiAccess := IsSystem := writtenSsasg := false _isUiAccess := UiAccess.CheckForUiAccess(, IsSystem) if (!_isUiAccess) { if (!_UIA) _UIA := new UiAccess() else _UIA.On() uia_wasoff := true if !(_isUiAccess := _UIA.CheckForUiAccess()) return } RegRead SoftwareSASGeneration, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration if ((ssasgNotExisting := ErrorLevel) || !(SoftwareSASGeneration & 0x2)) { if (!A_IsAdmin) { return } else { RegWrite REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration, 3 ; Enable services and Ease of Access apps (i.e., uiAccess applications) to simulate SAS writtenSsasg := !ErrorLevel } } DllCall("SAS.dll\SendSAS", "Int",!IsSystem) if (writtenSsasg) { if (ssasgNotExisting) RegDelete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration else RegWrite REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration, %SoftwareSASGeneration% } if (uia_wasoff) _UIA.On(false) if IsByRef(isUiAccess) isUiAccess := _isUiAccess if IsByRef(AsUser) AsUser := !IsSystem } ; sessionId = 1 - use current session ; If you using external UiAccess class pass it instanse to UIA argument SendSasEx(sessionId := -1, _UIA := 0) { if (sessionId = -1) DllCall("ProcessIdToSessionId", "UInt",DllCall("GetCurrentProcessId", "UInt"), "UIntP",sessionId) isUiAccess := IsSystem := false isUiAccess := UiAccess.CheckForUiAccess(, IsSystem) if (!isUiAccess || !IsSystem) { if (_UIA) _UIA.ImpersonateSYSTEM() else _UIA := new UiAccess(, true) } RegRead SoftwareSASGeneration, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration if (!ErrorLevel) RegDelete, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration ; http://www.atelierweb.com/index.php/ctrlaltdel/ retval := DllCall("WMsgAPI.dll\WmsgSendMessage", "UInt",sessionId, "UInt",magicNumber:=0x208, "Ptr",pid:=0, "PtrP",lParam:=0, "UInt") if (isUiAccess && !IsSystem) _UIA.On() else if (!isUiAccess && IsSystem) _UIA.ImpersonateSYSTEM(false) else if (!isUiAccess && !IsSystem) _UIA.On(false) if (SoftwareSASGeneration != "") RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System, SoftwareSASGeneration, % SoftwareSASGeneration return retval } #Include