1. 程式人生 > >不改變登陸賬號,切換身份訪問共享

不改變登陸賬號,切換身份訪問共享

使用場景

  • 做運維時需要在使用者桌面環境下,訪問運維部門共享,切換使用者較麻煩
  • 方便來回測試使用者共享許可權設定等

注意使用完後記得切回原來使用者身份,以免該使用者使用你的許可權操作共享!

注意使用完後記得切回原來使用者身份,以免該使用者使用你的許可權操作共享!

基本原理

1 . 使用net use斷開已有的使用者連線

net use * /del /y

2 . 使用新賬號net use到共享

REM 不一定要使用ipc$,可以用已有的路徑
net use \\share-server-ip\ipc$

3 . 呼叫explorer.exe開啟共享

explorer \\share-server-ip

工具下載

以下為C#版工具原始碼和示意圖,可自行定製修改

https://download.csdn.net/download/leoforbest/10308818

這裡寫圖片描述

autoit指令碼

#include<GUIConstantsEx.au3>

$server = "\\192.168.241.135"
$NETBIOS_NAME = "TEST\"

MainGUI()

Func MainGUI()
   Local $button,$msg
   GUICreate("共享切換工具",300,200)

   $button
= GUICtrlCreateButton("
下一步",100,100,100) $label = GUICtrlCreateLabel("請確保本程式是複製到本地電腦再執行!",50,30) $label2 = GUICtrlCreateLabel("請關閉所有開啟的" & $server &"視窗!",50,50) $button1 = GUICtrlCreateButton("下一步",100,150,100) $nameL = GUICtrlCreateLabel("帳號:",50,70) $passL = GUICtrlCreateLabel("密碼:",50,90) $name
= GUICtrlCreateInput("
",90,70,120) $pass = GUICtrlCreateInput("",90,90,120) GUICtrlSetState($button1,$GUI_HIDE) GUICtrlSetState($nameL,$GUI_HIDE) GUICtrlSetState($passL,$GUI_HIDE) GUICtrlSetState($name,$GUI_HIDE) GUICtrlSetState($pass,$GUI_HIDE) Dim $keys[1][2] = [["{Enter}",$button]] Dim $keys2[1][2] = [["{Enter}",$button1]] GUISetAccelerators($keys) GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE ExitLoop Case $msg = $button GUICtrlSetData($label,"正在斷開與" & $server & "的連線!") GUICtrlDelete($button) GUICtrlDelete($label2) ProcessWaitClose(RunWait("net use * /del /y","",@SW_HIDE),30) GUICtrlSetData($label," 請正確輸入使用者名稱和密碼!") GUICtrlSetState($button1,$GUI_SHOW) GUICtrlSetState($nameL,$GUI_SHOW) GUICtrlSetState($passL,$GUI_SHOW) GUICtrlSetState($name,$GUI_SHOW) GUICtrlSetState($pass,$GUI_SHOW) GUISetAccelerators($keys2) Case $msg = $button1 $nameget = GUICtrlRead($name) $passget = GUICtrlRead($pass) GUICtrlDelete($label) GUICtrlDelete($button1) GUICtrlDelete($nameL) GUICtrlDelete($passL) GUICtrlDelete($name) GUICtrlDelete($pass) GUICtrlCreateLabel("正在建立與" & $server & "的新的連線!",50,90) ProcessWaitClose(Run("net use " & $server & "\ipc$ " & $passget & " /user:" & $NETBIOS_NAME & $nameget,"",@SW_HIDE),30) If @extended = 0 Then Run("explorer.exe " & $server) Exit(1) Else MsgBox(0,"共享盤切換?","帳號密碼錯誤,或者" & $server & "未完全關閉,請重試!") Exit(0) EndIf EndSelect WEnd EndFunc

c#客戶端

部分關鍵程式碼

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.tbServer.Text = server;
        }

        private static string server = @"192.168.241.135";
        // 輸入你的域NETBIOS名,非域環境為空
        private static string domain = @"";
        private delegate void setTextHandler(string text);
        private delegate void enableLoginHandler();
        private Thread th;
        private Process p;

        private void setText(string text)
        {
            if(this.lblLog.InvokeRequired)
            {
                setTextHandler handler = new setTextHandler(setText);
                this.lblLog.Invoke(handler, text);
            }
            else
            {
                this.lblLog.Text = text;
            }
        }

        private void enableLogin()
        {
            if (this.btnLogin.InvokeRequired)
            {
                enableLoginHandler handler = new enableLoginHandler(enableLogin);
                this.btnLogin.Invoke(handler);
            }
            else
            {
                this.btnLogin.Enabled = true;
            }
        }

        private void doMain()
        {
            p = new Process();
            p.StartInfo.FileName = "cmd";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();

            setText("正在斷開與伺服器舊的連線!");
            p.StandardInput.WriteLine("net use * /del /y");
            setText("正在使用新賬號密碼連線伺服器!");

            p.StandardInput.WriteLine(String.Format(@"net use \\{0}\ipc$ {1} /user:{2}{3}", server, tbPwd.Text, domain, tbAccount.Text));
            p.StandardInput.WriteLine("exit");
            string ret = p.StandardError.ReadToEnd();
            setText("正在開啟共享!");
            if (ret.Contains("不允許一個使用者使用一個以上使用者名稱與伺服器或共享資源的多重連線"))
            {
                setText("訪問共享失敗!");
                MessageBox.Show("失敗,請關閉所有開啟的共享目錄或檔案!" + ret, "訪問共享失敗");
            }
            else if (ret == "")
            {
                setText("訪問共享成功!");
                Process.Start("explorer.exe", String.Format(@"\\{0}", server));
            }
            else
            {
                setText("訪問共享失敗!");
                MessageBox.Show(ret, "訪問共享失敗");
            }
            p.WaitForExit();
            enableLogin();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            lblLog.Text = "";
            if (tbAccount.Text == "" || tbPwd.Text == "")
            {
                lblLog.Text = "使用者名稱或密碼不能為空!";
                return;
            }

            btnLogin.Enabled = false;
            th = new Thread(doMain);
            th.Start();    
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if(p != null)
                p.Close();
        }

        private void tbAccount_TextChanged(object sender, EventArgs e)
        {
            lblLog.Text = "";
        }

    }