[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) 選擇專案,右鍵 -> 屬性 -> 安全性 -&