我发现这段代码可以获得 Windows 写入权限,但它不起作用
Posted
技术标签:
【中文标题】我发现这段代码可以获得 Windows 写入权限,但它不起作用【英文标题】:I found this code to get windows write privileges but it does not working 【发布时间】:2012-07-01 16:54:40 【问题描述】:我正在尝试使用 c/c++ 在 D: 驱动器上创建新文件
谁能帮助我,我是 C++ 新手?
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable (or disable privilege)
)
// Token privilege structure
TOKEN_PRIVILEGES tp;
// Used by local system to identify the privilege
LUID luid;
if(!LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid)) // receives LUID of privilege
printf("LookupPrivilegeValue() error: %u\n", GetLastError());
return FALSE;
else
printf("LookupPrivilegeValue() is OK\n");
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
// Don't forget to disable the privileges after you enabled them,
// or have already completed your task. Don't mess up your system :o)
if(bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
printf("tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED\n");
else
tp.Privileges[0].Attributes = 0;
printf("tp.Privileges[0].Attributes = 0\n");
// Enable the privilege (or disable all privileges).
if(!AdjustTokenPrivileges(
hToken,
FALSE, // If TRUE, function disables all privileges, if FALSE the function modifies privilege based on the tp
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL))
printf("AdjustTokenPrivileges() error: %u\n", GetLastError());
return FALSE;
else
printf("AdjustTokenPrivileges() is OK, last error if any: %u\n", GetLastError());
printf("Should be 0, means the operation completed successfully = ERROR_SUCCESS\n");
return TRUE;
我的主要功能
int main()
LPCTSTR lpszPrivilege = L"SeSecurityPrivilege";
// Change this BOOL value to set/unset the SE_PRIVILEGE_ENABLED attribute
BOOL bEnablePrivilege = TRUE;
HANDLE hToken;
// Open a handle to the access token for the calling process. That is this running program
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
printf("OpenProcessToken() error %u\n", GetLastError());
return FALSE;
else
printf("OpenProcessToken() is OK\n");
// Call the user defined SetPrivilege() function to enable and set the needed privilege
BOOL test = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
printf("The SetPrivilege() return value: %d\n\n", test);
ofstream myFile;
myFile.open("C:\\test.txt");
myFile << "I am C";
myFile.close();
bEnablePrivilege = FALSE;
BOOL test1 = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
printf("The SetPrivilage() return value: %d\n", test1);
system("PAUSE");
return 0;
控制台输出如下:
OpenProcessToken() is OK
LookupPrivilegeValue() is OK
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges() is OK, last error if any: 1300
Should be 0, means the operation completed successfully = ERROR_SUCCESS
The SetPrivilege() return value: 1
LookupPrivilegeValue() is OK
tp.Privileges[0].Attributes = 0
AdjustTokenPrivileges() is OK, last error if any: 1300
Should be 0, means the operation completed successfully = ERROR_SUCCESS
The SetPrivilage() return value: 1
Press any key to continue . . .
【问题讨论】:
1300 == ERROR_NOT_ALL_ASSIGNED,表示令牌中不存在特权。您必须是管理员组的成员并以管理员身份运行才能正常工作。 【参考方案1】:SeSecurityPrivilege
是“管理审核和安全日志”用户权限(请参阅list of privilege constants)。它与写入文件完全无关。事实上,在正常情况下,您不需要启用任何权限来将文件写入驱动器的根目录,尽管该进程确实需要以管理员身份运行。
Error 1300 表示“并非所有引用的权限或组都分配给调用者。”也就是说,该权限未成功启用,因为该进程无权获得它。这是因为进程没有以管理员身份运行。
因此,首先,您可以删除示例中的几乎所有代码,除了实际写入文件的四行之外的所有代码。然后你只需要以管理员身份运行应用程序。
为此,请右键单击可执行文件并选择“以管理员身份运行”。如果您以这种方式运行应用程序,它将能够写入文件。 (注意:在 Windows XP 中,您不需要这样做,但您需要以具有管理权限的用户身份登录。)
【讨论】:
【参考方案2】:AdjustTokenPrivileges 无法从令牌中添加或删除权限。它只能启用当前禁用的现有权限或禁用当前启用的现有权限。
ERROR 1300 表示您还没有“SeSecurityPrivilege”。因此您无法启用或禁用它。
更多信息请查看: Changing Privileges in a Token
【讨论】:
以上是关于我发现这段代码可以获得 Windows 写入权限,但它不起作用的主要内容,如果未能解决你的问题,请参考以下文章
windows server 2012通过cwRsync做双机互为备份,iis无法写入文件的问题
有没有办法从 github 操作获得对 GitHub API 的写入权限?