首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Web 端一鍵啟動 WinForm 客戶端並免登入:Register Protocol + 命令列參數傳遞

     編輯:關於C#

B/S 後台管理系統需啟動 C/S 繪圖客戶端並自動登入,核心挑戰在於:瀏覽器如何喚起本地 EXE、如何安全傳遞認證資訊、客戶端如何解析參數。本文提供基於 WScript.Shell 的 JavaScript 呼叫方案,搭配環境變數註冊與命令列解析器,實現無縫銜接。

整體流程

  1. Web 頁面按鈕 → JavaScript Run(command) → WScript.Shell.Run 啟動 EXE。
  2. 安裝程式將客戶端目錄加入系統 PATH 環境變數,確保命令可被找到。
  3. 客戶端 Main() 解析命令列參數(用戶名+加密 Token)→ 呼叫免登入 API → 進入主視窗。

Web 端 JavaScript 啟動器


function Run(command) {
    window.oldOnError = window.onerror;
    window._command = command;
    window.onerror = function(err) {
        if (err.indexOf('automation') != -1) {
            alert('命令被使用者禁止!請調整 IE 安全性設定。');
            return true;
        }
        return false;
    };
    try {
        var wsh = new ActiveXObject('WScript.Shell');
        if (wsh) wsh.Run(command);
        window.onerror = window.oldOnError;
    } catch (e) {
        alert('找不到程式檔案,請確認已安裝客戶端。');
    }
}

// 使用範例:傳遞加密身分憑證
javascript:Run('EDNMS.UI.exe -u admin -p 4f5a51484e3c639b7c0e606511fe062d5f55aa0509638b385ed179e6d7fe4e9b7342f04c7c74b625574d6aa009693f386cef7b49536c3a4bfb5372675e76bb134f746a84466b7da86703');

安裝程式:註冊 PATH 環境變數


[RunInstaller(true)]
public class InstallAction : Installer {
    public override void Install(IDictionary stateSaver) {
        base.Install(stateSaver);
        UpdatePathEnvironment();
    }

    private void UpdatePathEnvironment() {
        string regKey = @"SYSTEM\ControlSet001\Control\Session Manager\Environment";
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(regKey, true)) {
            string path = key.GetValue("Path").ToString();
            if (!path.Contains(physicalRoot)) {
                key.SetValue("Path", path + ";" + physicalRoot);
            }
        }
    }
}

客戶端命令列解析器


public static class CommandLine {
    public static CommandArgs Parse(string[] args) {
        var ca = new CommandArgs();
        int i = -1;
        string token = NextToken(args, ref i);
        while (token != null) {
            if (IsArg(token)) { // 以 - 或 \ 開頭
                string arg = token.TrimStart('-', '\\').TrimEnd('=');
                string value = null;
                if (arg.Contains("=")) {
                    var parts = arg.Split(new[]{'='}, 2);
                    arg = parts[0]; value = parts[1];
                }
                while (value == null) {
                    string next = NextToken(args, ref i);
                    if (next == null || IsArg(next)) { i--; value = "true"; }
                    else if (next != "=") value = next.TrimStart('=');
                }
                ca.ArgPairs[arg] = value;
            } else if (token != "") {
                ca.Params.Add(token);
            }
            token = NextToken(args, ref i);
        }
        return ca;
    }
    // 輔助方法 IsArg, NextToken 略
}

程式進入點處理免登入


[STAThread]
static void Main(string[] args) {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    if (args.Length > 0) LoginByArgs(args);
    else LoginNormal(args);
}

static void LoginByArgs(string[] args) {
    var cmdArgs = CommandLine.Parse(args);
    string user = cmdArgs.ArgPairs.GetValueOrDefault("u");
    string token = cmdArgs.ArgPairs.GetValueOrDefault("p");
    if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(token)) {
        if (Portal.gc.LoginByIdentity(user, token)) ShowMainDialog();
        else LoginNormal(args);
    }
}

IE 安全性設定提醒

使用者需在 IE「網際網路選項 → 安全性 → 自訂等級 → ActiveX 控制項與外掛程式 → 對未標示為安全的 ActiveX 控制項初始化並指令碼」選擇「啟用」或「提示」,否則 WScript.Shell 會被阻擋。

安全性建議

  • Token 應為一次性、短效期、綁定 IP/Session 的簽名字串,避免明文密碼傳遞。
  • 生產環境建議改用自訂 URI 協定(如 myapp://login?token=xxx)替代 ActiveX,相容性更佳且安全性更高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved