我需要下载大文件。为了加快传输,我每个文件使用多个连接。为了减少磁盘碎片,我在创建后告诉窗口文件的最终大小。为了避免在写入最后一个连接的第一个字节时零初始化,我使用SetFileValidData将文件初始化为垃圾。问题是SetFileValidData需要通常只有管理员才具有的SE_MANAGE_VOLUME_NAME权限。如何为无效用户(启用了UAC的管理员用户)启用SE_MANAGE_VOLUME_NAME?
答案 0 :(得分:1)
你不能;没有办法让进程运行受限制的令牌提升权限。
考虑使用系统服务来执行提升的任务。至少有三种可能的方法:
从服务中完成所有工作,包括下载。
从应用程序下载并使用共享内存向服务提供数据以写入文件。
让服务创建并扩展文件,然后为应用程序提供只写句柄。 (它必须是只写的,以确保在绕过零初始化时不能欺骗应用程序读取文件中留下的潜在敏感数据。)
请注意,在所有这些情况下,您还需要注意您在文件上设置的权限。
或者,根据协议,您可以以不同方式组织下载流。而不是每个流获取一个大的连续数据块,以便最后一个流写入文件的末尾,让每个流获取一系列较小的散布块,您可以按顺序写入该文件。
(如果协议仅允许每个连接获取一个连续的数据块,这可能是不可行的,因为为每个块建立新连接会产生额外的开销。)