草庐IT

windows - 我发现这段代码可以获取 Windows 写入权限,但它不起作用

coder 2023-11-12 原文

我正在尝试使用 c/c++ 在 D: 驱动器上创建新文件

我发现这段代码可以获取 windows 写入权限,但它不起作用

任何人都可以帮助我,我是 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 . . .

最佳答案

  1. SeSecurityPrivilege 是“管理审计和安全日志”用户权限(参见 list of privilege constants)。它与写入文件完全无关。事实上,在正常情况下,您不需要启用任何权限即可将文件写入驱动器的根目录,尽管该进程确实需要以管理员身份运行。

  2. Error 1300表示“并非所有引用的权限或组都分配给调用者。”也就是说,该权限未成功启用,因为该进程无权使用它。这是因为进程未以管理员身份运行。

因此,首先,您可以删除示例中的几乎所有代码,除了实际写入文件的四行之外的所有代码。然后您只需以管理员身份运行该应用程序。

为此,右键单击可执行文件并选择“以管理员身份运行”。如果您以这种方式运行应用程序,它将能够写入文件。 (注意:在 Windows XP 中,您不需要执行此操作,但您需要以具有管理权限的用户身份登录。)

关于windows - 我发现这段代码可以获取 Windows 写入权限,但它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11283919/

有关windows - 我发现这段代码可以获取 Windows 写入权限,但它不起作用的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐