1. 程式人生 > >[C++]以不同使用者身份執行程式

[C++]以不同使用者身份執行程式

以不同使用者身份執行程式

一直想方便的處理CCProxy代理的帳號管理,所以夢想做一個比較好的管理工具。但一個最麻煩的問題就是帳號的更新,CCProxy有一個網頁管理功能,可以加帳號,但加的帳號就是不可以立即更新。中午上網的時候發現CCProxy有一功能就是支援命令列的操作,如:
  CCProxy -reboot  重啟軟體
  CCProxy -reset   更新配置
  CCProxy -update  更新帳號
  
  試著改了AccInfo.ini中帳號資訊,在DOS中執行CCProxy -update的確更新了賬號,所以開始用PHP做管理工具,做到呼叫CCProxy -update時,用了PHP中的exec(),system()等函式一直沒有效果,後又通過呼叫批處理檔案來呼叫命令列引數都不行。 處理得正沒耐心的時候,一氣之下狂重新整理PHP網頁,電腦卡死,用程序管理器檢視時發現打開了多個CCProxy程序,認真一看,除了一個CCProxy是使用者程序外其它CCProxy全是system程序。認真一想有可能是執行使用者身份不同所產生的結果。
  Apache服務呼叫的外部程式以system身份執行,自己雙擊執行的程式以使用者身份執行。 如果CCProxy -update以使用者身份執行是不是就可以了呢?本人在網路上找到了runas這個命令,的確可以指定以哪個使用者執行,但是每次都要輸密碼,沒有密碼的帳號就要加上密碼才可以用,“/savecred”這個引數可以用,只要輸入一次密碼就可以了,但在PHP中發現要以system的身份輸入一次才行,根本沒有機會輸入。打算用C程式來處理這個問題。可是發現用WinExec(),ShellExecute(),CreateProcess()都不好處理這個問題,好在發現了CreateProcessAsUser()這個函式。把網路上的程式改了幾處,編譯後一試問題終於解決。
   以下為相關程式碼:
// Update.cpp : 定義控制檯應用程式的入口點。

#include "stdafx.h"  
#include <windows.h>  
#include <tlhelp32.h>  
  
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)  
{  
    if(!lpName)  
        return FALSE;  
      
    HANDLE         hProcessSnap = NULL;   
    BOOL           bRet      = FALSE;   
    PROCESSENTRY32 pe32      = {0};   
      
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
    if (hProcessSnap == INVALID_HANDLE_VALUE)   
        return (FALSE);   
      
    pe32.dwSize = sizeof(PROCESSENTRY32);   
      
    if (Process32First(hProcessSnap, &pe32))   
    {    
        do   
        {  
            if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))  
            {  
                HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,  
                    FALSE,pe32.th32ProcessID);  
                bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);  
                CloseHandle (hProcessSnap);   
                return (bRet);  
            }  
        }   
        while (Process32Next(hProcessSnap, &pe32));   
        bRet = TRUE;   
    }    
    else   
        bRet = FALSE;  
      
    CloseHandle (hProcessSnap);   
    return (bRet);  
}  
  
BOOL RunProcess(LPCSTR lpImage,LPSTR lpCommandLine)  
{  
    if(!lpImage)  
        return FALSE;  
      
    HANDLE hToken;  
    if(!GetTokenByName(hToken,"EXPLORER.EXE"))  
        return FALSE;  
      
    STARTUPINFO si;  
    PROCESS_INFORMATION pi;  
      
    ZeroMemory(&si, sizeof(STARTUPINFO));  
    si.cb= sizeof(STARTUPINFO);  
    si.lpDesktop = TEXT("winsta0\default");  
      
    BOOL bResult = CreateProcessAsUser(hToken,lpImage, lpCommandLine,NULL,NULL,  
        FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);  
    CloseHandle(hToken);  
    if(bResult)  
    {  
        OutputDebugString("CreateProcessAsUser ok!
");  
        printf("CreateProcessAsUser ok!
");  
    }  
    else  
    {  
        OutputDebugString("CreateProcessAsUse* **lse!
");  
        printf("CreateProcessAsUse* **lse!
");  
    }  
    return bResult;  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    RunProcess("CCProxy.exe"," -update");  
    return 0;  
}

相關推薦

[C++]不同使用者身份執行程式

以不同使用者身份執行程式 一直想方便的處理CCProxy代理的帳號管理,所以夢想做一個比較好的管理工具。但一個最麻煩的問題就是帳號的更新,CCProxy有一個網頁管理功能,可以加帳號,但加的帳號就是不可以立即更新。中午上網的時候發現CCProxy有一功能就是支援命令列的操作

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

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

C#如何管理員身份執行程式

  在使用winform程式獲取呼叫cmd命令提示符時,如果是win7以上的作業系統,會需要必須以管理員身份執行才會執行成功,否則無效果或提示錯誤。      比如在通過winform程式執行cmd命令時,某些情況下如果不是以管理員身份執行,則會提示命令無效。    

linux下如何某個使用者的身份執行程式

假設使用者名稱為username,需要執行command程式,命令如下: su username -l -c "comman" 其中“-l”表示以登入方式執行,這就意味著username的環境變數會被初始化,這在很多情況下是必須的。

Linux下的C/C++開發基礎(編寫makefile、編譯C/C++、連結、可執行程式

本文重點介紹C/C++原始碼工程的編譯連結,編譯器gcc/g++的安裝配置略過... 1. 安裝配置gcc g++ 2. 建立檔案 test.h /test.c / file.h  / file.cpp  3. 編譯.o庫: gcc -c / g++ -c     連結生成靜

linux C語言獲取當前可執行程式的路徑及檔名 vs 獲取當前工作路徑

 獲取當前工作路徑: 標頭檔案:#include <unistd.h> 定義函式:char * getcwd(char * buf, size_t size); 函式說明:getcwd()會將當前的工作目錄絕對路徑複製到引數buf 所指的記憶體空間,引數size

Linux下,不能根使用者身份執行google chrome 瀏覽器的解決辦法

用的Ubuntu軟體中心裝的chromium,和在google上下載的chrome多少有點不一樣,因為安裝目錄沒有在opt目錄下: 在/usr/share/applications/chromium-browser.desktop的快捷圖示上右鍵,點選屬性,修改命令屬性,修

Java超級使用者身份執行系統命令的方式

執行Linux系統命令, 如果無法獲取root許可權, 會丟擲異常 public void testDate(){ Log.i("zmr", "testDate"); try { Process

利用ShellExecuteEx手動提升使用者特權,管理員許可權來執行程式。win7會有UAC彈窗

#include <stdio.h> #include<windows.h> #include<tchar.h> int _tmain(int argc,TCHAR* argv[]) { SHELLEXECUTEINFO sei={sizeof(SHELLEXECUTE

利用ShellExecuteEx手動提升使用者特權,管理員許可權來執行程式

                      #include <stdio.h> #include<windows.h> #include<tchar.h> int _tmain(int argc,TCHAR* argv[])

備忘:讓tomcat非root身份執行

root許可權太大,修改tomcat服務啟動指令碼 #vi /etc/rc.d/init.d/tomcat #!/bin/bash # chkconfig: 345 99 10 # description: Startup Script for tomcat # /

Ubuntu下不能根使用者身份執行 Google Chrome 瀏覽器

Edit the file /opt/google/chrome/google-chrome find exec -a "$0" "$HERE/chrome" "[email protected]" change as  exec -a "$0" "$HER

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

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

C# WinForm判斷Win7下程式是否管理員身份執行

如果程式不是以管理員身份執行,操作本地檔案會提示:System.UnauthorizedAccessException異常 Vista 和 Windows 7 作業系統為了加強安全,增加了 UAC(使用者賬戶控制) 的機制,如果 UAC 被開啟,使用者即使是以管理員許可權登

判斷程式是否是 管理員 身份執行 visual c++

// 判斷本程式是否是以管理員身份執行的 //BY :暗影行者 // date: 20110716 BOOL ExeIsAdmin() { #define ACCESS_READ 1 #define ACCESS_WRITE 2 // if(g_bIsN

C# WinForm判斷程式是否管理員身份執行,UAC許可權的提權與降權

另外新增2個相關文章(只有提權,沒有提到降低許可權): 歡迎轉載,但最好請註明  Jero 翻譯。 已提權、已經提升許可權的程序——可以理解為使用管理員許可權執行的。未提權、沒有提升許可權的程序——可以理解為使用 非 管理員許可權(既普通使用者許可權)執行的。 UAC機制是由Vista引出,並

Win7 C# 控制檯程式寫登錄檔被拒,需要管理員身份執行

      最近寫了一個控制檯程式,將程式的相關資訊註冊到登錄檔中。但是執行的時候提示寫登錄檔被拒。電腦的當前使用者沒有管理員的許可權。         如何給控制檯程式賦管理員的許可權呢?    

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

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

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

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

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

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