1. 程式人生 > >以管理員身份執行指令碼一閃而過的原因及解決方法

以管理員身份執行指令碼一閃而過的原因及解決方法

一個簡單的複製檔案的指令碼,用於安裝軟體,在 Win7 下右擊以管理員身份執行,竟然一閃而過,雖然指令碼中有 pause 。後檢查目標目錄,毫無疑問自然是複製失敗,軟體安裝失敗。死活未能看出來指令碼有何問題,因為這指令碼本身已經夠簡單了,而且對於先啟動 cmd 再手動啟動該指令碼的情況沒有任何問題。更無語的是後來在多臺機器上嘗試,竟有部分成功部分失敗的現象。估計應該是系統問題,但無論怎樣總得要讓指令碼能夠執行起來,事在人為。解決方法倒不復雜,就是顯得有些蛋疼,專門建個 install.exe 僅僅就是為了啟動同目錄下的 install.cmd ,你說什麼感覺!

附 install.c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
#include <windows.h>

#ifndef _WIN64
// 退出程序,若在 64 位系統上執行的話
void EXIT_IF_WOW64()
{
    typedef BOOL (WINAPI *is_wow64_type)(HANDLE, PBOOL);
    is_wow64_type is_wow64;
    BOOL wow64 = FALSE;
    is_wow64 = (is_wow64_type)GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),
        "IsWow64Process"
    );
    if(is_wow64 != NULL)
        is_wow64(GetCurrentProcess(), &wow64);
    if(wow64) {
        printf(
            "This program must run on x86 systems."
            " Plese any key to end.\n"
        );
        system("pause > nul");
        exit(-1);
    }
}
#else
#define EXIT_IF_WOW64()
#endif  // _WIN64

// 指令碼相對路徑
const char *InsCmdFile = ".\\install.cmd";

int main()
{
    char *p;
    char *path=(char *)malloc(PATH_MAX);
    EXIT_IF_WOW64();
    if(GetModuleFileName(NULL, path, PATH_MAX) == 0) {
        printf("Error! Path is too long!");
        return 1;
    }
    for(p=path; *p!='\0'; ++p);
    for(--p; *p!='\\'; --p) {
        if(p<path) {
            printf("Error!");
            return 2;
        }
    }
    *p='\0';
    printf("chdir /d \"%s\"\n%s\n", path, InsCmdFile);
    chdir(path);
    system(InsCmdFile);
    return 0;
}

===============================================================================
後記:
根本原因找到了,在於指令碼所在路徑存在一些對於 cmd /c 來說的“特殊字元”。具體哪些是特殊字元可在 cmd 幫助中查到,其中就包括空格,所以稍有不慎放錯地方就會出問題。
由此可推斷,右擊以管理員身份執行在呼叫 cmd.exe 時只是簡單地將指令碼絕對路徑直接作為引數傳了過去,並未進行加引號等處理,也沒用我所寫的先切換目錄再用相對路徑執行指令碼的方法。
其實 system() 也不處理任何特殊字元,若用絕對路徑也有可能失敗。
===============================================================================
今天又發現
更好的方法
了,這很適用於自己的系統,因為要修改目標系統,用在別人的機器上得要考慮考慮。

相關推薦

管理員身份執行指令碼一閃而過原因解決方法

一個簡單的複製檔案的指令碼,用於安裝軟體,在 Win7 下右擊以管理員身份執行,竟然一閃而過,雖然指令碼中有 pause 。後檢查目標目錄,毫無疑問自然是複製失敗,軟體安裝失敗。死活未能看出來指令碼有何問題,因為這指令

Eric6安裝後無法執行指令碼原因解決方法

eric6 PyQt5安裝後對於python檔案進行了正確的程式設計和正常編譯之後,就應該是執行程式碼了,點開開始->執行指令碼選項卡中卻無論如何不能夠執行指令碼 特徵 開始->執行指令碼 這個按鈕一直顯示為灰色 (選項卡檢測到滑鼠事件才會顯示,所以用手

win7 批處理檔案預設管理員身份執行清除IE快取指令碼

1、指令碼預設以管理員身份執行 在win7中,批處理檔案有時需要以管理員身份執行,如清除 IE 快取的指令碼,若不使用管理員許可權,常常會卡死。 批處理檔案以管理員身份執行很簡單,可惜,竟然很長時間不知道怎麼去設定,原來總是在“相容性”裡設定以管理員身份執行,可是批處理檔案

管理員身份執行bat指令碼時,獲取當前檔案所在目錄

以管理員身份執行bat指令碼時,獲取當前檔案所在目錄     知道windows的bat指令碼很強大,但是具體命令向來很少接觸,今天在win7上執行自己以前寫的一個安裝mysql資料庫到系統服務的指令碼時,遇到一些問題,下面記錄一下。<?xml:namespa

win7/10中管理員身份執行bat指令碼時,獲取當前檔案所在目錄

此命令適用於bat雙擊正常開啟,以管理員開啟閃退的情況 以下為轉載,地址http://blog.chinaunix.net/uid-27000874-id-3224772.html 知道windows的bat指令碼很強大,但是具體命令向來很少接觸,今天在win7上執行自己

Lsrunase普通域用戶管理員身份執行某個軟件

exe nas pil mpi -o strong window spa 方法 應用場景:例如金蝶軟件的有些功能必須使用管理員身份執行方可使用 使用方法:1. 將lsrunase文件夾內的lsrunase.exe復制到電腦的C:\Windows\System32下2

如何在DOS下管理員身份執行命令?

管理員 info -s ont window 命令 com 管理 轉換 原創 普通User的DOS窗口: 以管理員身份運行的DOS窗口: 轉換(Windows10系統下): 13:11:55 2018-10-18如何在DOS下以管理員身份執行命令?

c# 設定管理員身份執行開發的軟體 visual studio 2017

用C#開發的軟體需要獲得管理員許可權對C盤檔案進行更改。此文更改C#的manifest檔案以達到雙擊執行開發出的軟體時提示以管理員身份執行的效果。 1.建立manifest檔案。 右擊專案-> 可在此更改檔名(字尾不能更改)-> 2.開啟新建立的manifes

Ubuntu伺服器中建立新使用者並且允許該使用者管理員身份執行指令

目錄 1. 新建可登入圖形使用者介面的使用者 2. 允許該使用者以管理員身份執行指令 sudo” 是Unix/Linux平臺上的一個非常有用的工具,允許為非根使用者賦予一些合理的“權利”,讓他們執行一些只有根使用者或特許使用者才能完成的任務,從而減少根使用者的登陸次數和管理

在VS中如何讓C#語言編寫的程式自動管理員身份執行

 在Vista或Win7或Win8或Win10系統上exe程式預設不是以管理員身份執行的,它會被UAC(使用者帳戶控制)阻止訪問系統某些功能,如修改登錄檔操作、操作硬碟上的檔案等。但是有時我們確實需要程式在開始執行時就是以管理員身份執行的,這時我們在VS中需進行以下操作:

結合VBS,實現批處理自動管理員身份執行

這是我在百度回答知友時寫的,用於自動以管理員身份執行命令或程式→百度原址 批處理程式碼,功能:自動以管理員身份執行 test.exe: MS DOS start admin.vbs runas /user:administrator test.e

Win10下Visual Studio 2015編譯報“無法註冊程式集***dll- 拒絕訪問。請確保您正在管理員身份執行應用程式。對登錄檔項”***“的訪問被拒絕。”問題解決

原來在Win7下Visual Studio2008跑的好好的程式,現在在Win10下編譯報“無法註冊程式集dll- 拒絕訪問。請確保您正在以管理員身份執行應用程式。對登錄檔項”“的訪問被拒絕。”的錯誤。報錯資訊明面上看是讓你用管理員身份執行Visual Studio,然後開啟工程編譯就好了。

Windows 10 上強制Visual Studio管理員身份執行

Windows 10 的一個既安全又蛋疼之處是UAC的行為被改變了。以往在Windows 7中,只要關閉了UAC,自己的帳號又是本機管理員組的,任何程式都會以管理員身份啟動。然而,在Windows 8上,我們不能關閉UAC,那樣的話Metro程式就一個都啟動不了了。 作為微

命令列裡管理員身份執行msi檔案

以管理員身份執行cmd進入msi檔案目錄,輸入命令msiexec /package 檔名,我的輸入:msiexec /package mpich2-1.4-win-x86-64.msi然後,程式以管理員身份進入安裝,接著你就可以成功安裝軟體啦!

管理員身份執行msi檔案

鍵盤輸入win+r,執行輸入regedit,開啟登錄檔編輯器找到計算機\HKEY_CLASSES_ROOT\Msi.Package\shell,右鍵點選shell,選擇新建->項,命名為“runas”,選中runas項,雙擊右側視窗的“預設”,在彈出的視窗中數值資料處輸

解決IDM“警告:您在管理員身份執行IDM,在該模式下,IDM無法接管瀏覽器的下載事件”的問題。

執行,輸入gpedit.msc確定,把如圖的那個改成“已啟用” 造成該問題的原因是有些電腦系統內建管理員賬戶Administrator,所以開啟所有軟體都是以管理員許可權,跳過了UAC(使用者賬戶控制),如上修改組策略後,即可解決。

Win10設定VS2010管理員身份執行

  還是把寫下來的一對廢話刪了,直接說方法。   win+R(或者在開始選單上右鍵->“執行”),然後複製下面命令進去,回車搞定。 reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\C

[技巧.Dotnet]輕鬆實現“強制.net程式管理員身份執行”。

使用場景: 程式中不少操作都需要特殊許可權,有時為了方便,直接讓程式以管理員方式執行。 (在商業軟體中,其實應該儘量避免以管理員身份執行。在安裝或配置時,提前授予將相應許可權。) 做法: 以C#專案為例: 1) 選擇專案,右鍵 -> 屬性 -> 安全性 -&

C#預設管理員身份執行程式

Vista 和 Windows 7 作業系統為了加強安全,增加了 UAC(使用者賬戶控制) 的機制,如果 UAC 被開啟,使用者即使是以管理員許可權登入,其應用程式預設情況下也無法對系統目錄,系統登錄檔等可能影響系統執行的設定進行寫操作。這個機制大大增強了系統的安全性,但對應用程式開發者來說,我們不能強迫

Win7 下管理員身份執行批處理檔案,切換JDK版本

Win7下 切換JDK的批處理命令 1. 批處理檔案(必須以管理員身份執行)內容如下 @echo off rem --- Base Config 配置JDK的安裝目錄 --- :init set JAVA_HOME_1_8=C:\Program Files\Java\jdk1.8 set JAVA_HO