extract(source, startTag, endTag, caseSensitive := true) {
if (!source || !startTag || !endTag) {
return ""
}
startPos := InStr(source, startTag, caseSensitive)
if (!startPos) {
return ""
}
endPos := InStr(source, endTag, caseSensitive, startPos)
if (!endPos) {
return ""
}
return SubStr(source, startPos + StrLen(startTag), endPos - startPos - StrLen(startTag))
}
global server := "https://www.abc.com"
getRequest(url) {
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.setClientCertificate("CURRENT_USER\My\your_cert_name")
; 获取鉴权环境
whr.Open("POST", url, False)
whr.SetRequestHeader("Accept", "application/xml, text/xml, */*; q=0.01")
whr.SetRequestHeader("Accept-Encoding", "gzip, deflate, br, zstd")
whr.SetRequestHeader("Accept-Language", "zh-CN,zh;q=0.9")
whr.SetRequestHeader("Cache-Control", "no-cache")
whr.SetRequestHeader("Connection", "keep-alive")
whr.SetRequestHeader("Origin", server)
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Referer", server)
whr.SetRequestHeader("Sec-Fetch-Dest", "empty")
whr.SetRequestHeader("Sec-Fetch-Mode", "cors")
whr.SetRequestHeader("Sec-Fetch-Site", "same-origin")
whr.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0")
whr.SetRequestHeader("X-Citrix-AM-CredentialTypes", "none, username, domain, password, newpassword, passcode, savecredentials, textcredential, webview, nsg-epa, negotiate, nsg_push, nsg_push_otp, nf_sspr_rem, nsg-x1, nsg-setclient, nsg-eula, nsg-tlogin, nsg-fullvpn, nsg-hidden, nsg-auth-failure, nsg-auth-success, nsg-epa-success, nsg-l20n, GoBack, nf-recaptcha, ns-dialogue, nf-gw-test, nf-poll, nsg_qrcode, nsg_manageotp")
whr.SetRequestHeader("X-Citrix-AM-LabelTypes", "none, plain, heading, information, warning, error, confirmation, image, nsg-epa, nsg-epa-failure, nsg-login-label, tlogin-failure-msg, nsg-tlogin-heading, nsg-tlogin-single-res, nsg-tlogin-multi-res, nsg-tlogin, nsg-login-heading, nsg-fullvpn, nsg-l20n, nsg-l20n-error, certauth-failure-msg, dialogue-label, nsg-change-pass-assistive-text, nsg_confirmation, nsg_kba_registration_heading, nsg_email_registration_heading, nsg_kba_validation_question, nsg_sspr_success, nf-manage-otp")
whr.SetRequestHeader("X-Citrix-IsUsingHTTPS", "Yes")
whr.SetRequestHeader("X-Requested-With", "XMLHttpRequest")
whr.SetRequestHeader("sec-ch-ua", """Microsoft Edge"";v=""123"", ""Not:A-Brand"";v=""8"", ""Chromium"";v=""123""")
whr.SetRequestHeader("sec-ch-ua-mobile", "?0")
whr.SetRequestHeader("sec-ch-ua-platform", """Windows""")
return whr
}
whr := getRequest(server . "/nf/auth/getAuthenticationRequirements.do")
whr.send()
response := whr.ResponseText
url := extract(response, "<PostBack>", "</PostBack>")
if (whr.Status != 200 || !url) {
MsgBox, "获取鉴权环境失败"
return
}
; 获取令牌 NSC_TMAS
whr := getRequest(server . url)
whr.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
whr.Send("loginBtn=Log+On&StateContext=")
headers := whr.GetAllResponseHeaders()
response := whr.ResponseText
RegExMatch(headers, "NSC_TMAS=([^;]+)", NSC_TMAS)
if (!NSC_TMAS || whr.Status != 200) {
MsgBox, 获取 NSC_TMAS 失败
return
}
cookie := NSC_TMAS
; 开始鉴权
whr := getRequest(server . "/nf/auth/doAuthentication.do")
whr.SetRequestHeader("Cookie", cookie)
whr.Send("login=<your_name>&passwd=<your_password>&domain=<your_domain>&loginBtn=Log+On&StateContext=")
response := whr.ResponseText
headers := whr.GetAllResponseHeaders()
RegExMatch(headers, "NSC_AAAC=([^;]+)", NSC_AAAC)
StateContext := extract(response, "<StateContext>", "</StateContext>")
code := whr.Status
headers := whr.GetAllResponseHeaders()
if (!NSC_AAAC || whr.Status != 200) {
MsgBox, 鉴权 NSC_AAAC 失败
return
}
cookie := NSC_AAAC
; 配置客户端
whr := getRequest(server . "/p/u/setClient.do")
whr.SetRequestHeader("Cookie", cookie)
whr.Send("nsg-setclient=cvpn&StateContext=" . StateContext)
RegExMatch(whr.GetAllResponseHeaders(), "NSC_TEMP=([^;]+)", NSC_TEMP)
if (!NSC_TEMP || whr.Status != 200) {
MsgBox, 配置客户端失败
}
cookie := cookie . "; NSC_TEMP=" . NSC_TEMP
MsgBox, % cookie
whr := getRequest(server . "/cgi/resources/list")
whr.SetRequestHeader("Cookie", cookie)
whr.Send()
if (whr.Status != 200) {
MsgBox, 获取清单失败
return
}
response := whr.ResponseText
url := extract(response, "content"":""", """,")
whr := getRequest(url)
whr.SetRequestHeader("Cookie", cookie)
whr.Send()
if (whr.Status != 200) {
MsgBox, 下载 RDP 失败
return
}
rdp := whr.ResponseText . "
(
selectedmonitors:s:1
autoreconnection enabled:i:0
allow desktop composition:i:0
compression:i:1
desktopscalefactor:i:100
smart sizing:i:0
dynamic resolution:i:1
singlemoninwindowedmode:i:1
disable full window drag:i:1
cliprdr:i:1
bitmapcachepersistenable:i:1
disable menu anims:i:1
domain:s:corpdev
)"
rdpFile := "D:\remotedesktop.rdp"
FileDelete, % rdpFile
FileAppend, %rdp%, %rdpFile%
Run, mstsc /admin %rdpFile%