我想它應該是這樣的:
rundll32 kernel32.dll,DeleteFileA,test.txt
但這不起作用。我試過:
rundll32 kernel32.dll,DeleteFileA test.txt
rundll32 "kernel32.dll,DeleteFileA test.txt"
檔案保留。當我從 PowerShell 中嘗試它時,它會在我拼寫錯誤時顯示一條錯誤訊息,DeleteFileA因此它會在kernel32.dll. 由于沒有獲取檔案名引數,它可能無法正常作業。
為什么我需要它?我需要能夠在常規用戶背景關系中運行的程式中以管理員身份洗掉檔案。我絕對不希望整個應用程式以管理員身份運行。只有確切的一次洗掉才應顯示 UAC 確認。
這是在我的 C# 應用程式中有效的東西:
private static void DeleteAsAdmin(string target) {
Process.Start(new ProcessStartInfo { FileName = "cmd", Arguments = $"/C \"del /F /Q \"\"\"{target}\"\"\"\"", Verb = "RunAs", CreateNoWindow = true });
}
但是,它無論如何都會顯示一個視窗。有一段時間,但它是可見的。這是因為我必須顯式執行cmd才能使用該del命令。
這就是為什么我想用它rundll32來代替。默認情況下,這不會創建任何視窗。它有FileDeleteA方法公開。
我知道,我可以添加一個輔助可執行檔案,該可執行檔案會以管理員身份洗掉我的應用程式的檔案,但這是一個非常丑陋的解決方案,甚至比呼叫cmd.
為什么我首先需要洗掉檔案?為了安全。該檔案包含一個敏感的程式配置,該配置被加密(使用 DPAPI)并移動到用戶可訪問的目錄。為了更加安全,需要洗掉位于“C:\Program Files”中的原始檔案。如果用戶取消 UAC 提示,那將會失敗,但用戶的錯是他們的敏感配置為純文本。
是的,我知道我可以通過 MSI 將檔案放在用戶目錄中,但這對我來說也不好,因為它需要我想避免的額外配置步驟。在使用完全默認的 MSI 安裝程式安裝后,該程式必須自行完成所有雜務。我可以就這樣離開它,但似乎rundll32hack 只是在嘲笑我,而我離它只有一個特殊的角色;)
uj5u.com熱心網友回復:
rundll32 需要一個非常具體的函式簽名,它不是一個通用的“呼叫任何函式”幫助應用程式。
要隱藏 cmd 視窗,您可以嘗試添加,WindowStyle = ProcessWindowStyle.Hidden但如果您已經有一個 C# 應用程式,為什么還要麻煩呢?只需呼叫自己來完成任務。這至少會在 UAC 對話框中放置正確的 .exe。
即使你讓這一切正常作業,它仍然是錯誤的!如果您要安裝到 %ProgramFiles% 中,那么您正在為機器上的所有用戶安裝,并且一旦第二個用戶運行您的應用程式,您的方案就會中斷。寫入用戶組態檔的任何內容都必須在用戶第一次運行您的程式時完成,而不是在安裝階段。您可以將模板檔案從安裝目錄復制到用戶組態檔,但不能洗掉模板。
uj5u.com熱心網友回復:
如果您需要洗掉檔案,您可以使用IFileOperation它。示例代碼:
#include <shobjidl_core.h>
// assume
// CoInitializeEx(0, COINIT_DISABLE_OLE1DDE|COINIT_APARTMENTTHREADED);
// already called
HRESULT DeleteFileElevated(PCWSTR lpFilename)
{
IShellItem* psi;
HRESULT hr = SHCreateItemFromParsingName(lpFilename, 0, IID_PPV_ARGS(&psi));
if (0 <= hr)
{
IFileOperation *pFileOp;
BIND_OPTS2 bo = { sizeof(bo) };
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
if (0 <= (hr = CoGetObject(L"Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}", &bo, IID_PPV_ARGS(&pFileOp))))
{
0 <= (hr = pFileOp->SetOperationFlags(FOF_NOCONFIRMATION|
FOF_NOERRORUI|
FOF_FILESONLY|
FOFX_EARLYFAILURE|
FOFX_SHOWELEVATIONPROMPT)) &&
0 <= (hr = pFileOp->DeleteItem(psi, 0))
&&
0 <= (hr = pFileOp->PerformOperations());
pFileOp->Release();
}
psi->Release();
}
return hr;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352710.html
