Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当ini文件为远程文件时,模拟块中运行的GetPrivateProfileSectionNames返回0

当ini文件为远程文件时,模拟块中运行的GetPrivateProfileSectionNames返回0
EN

Stack Overflow用户
提问于 2013-07-08 22:33:46
回答 1查看 846关注 0票数 1

我的代码创建了一个模拟块来允许对远程ini文件的读访问和对远程目录的写访问。当要写入的“远程”目录确实是远程计算机UNC路径时,系统可以正常写入,但是如果“远程”ini文件确实是远程UNC路径,则GetPrivateProfileSectionNames返回0。但是,如果“远程”ini文件实际上只是一个本地UNC路径,则此函数将按预期工作。对于ini文件确实在远程计算机上的情况,有没有办法让这个函数像预期的那样工作?

我的模拟块是使用以下disposable类完成的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
public class Impersonation : IDisposable
{
    private WindowsImpersonationContext _impersonatedUserContext;

    // Declare signatures for Win32 LogonUser and CloseHandle APIs
    [DllImport("advapi32.dll", SetLastError = true)]
    static extern bool LogonUser(
      string principal,
      string authority,
      string password,
      LogonSessionType logonType,
      LogonProvider logonProvider,
      out IntPtr token);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool CloseHandle(IntPtr handle);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool RevertToSelf();

    // ReSharper disable UnusedMember.Local
    enum LogonSessionType : uint
    {
        Interactive = 2,
        Network,
        Batch,
        Service,
        NetworkCleartext = 8,
        NewCredentials
    }
    // ReSharper disable InconsistentNaming
    enum LogonProvider : uint
    {
        Default = 0, // default for platform (use this!)
        WinNT35,     // sends smoke signals to authority
        WinNT40,     // uses NTLM
        WinNT50      // negotiates Kerb or NTLM
    }
    // ReSharper restore InconsistentNaming
    // ReSharper restore UnusedMember.Local

    /// <summary>
    /// Class to allow running a segment of code under a given user login context
    /// </summary>
    /// <param name="user">domain\user</param>
    /// <param name="password">user's domain password</param>
    public Impersonation(string user, string password)
    {
        var token = ValidateParametersAndGetFirstLoginToken(user, password);

        var duplicateToken = IntPtr.Zero;
        try
        {
            if (DuplicateToken(token, 2, ref duplicateToken) == 0)
            {
                throw new Exception("DuplicateToken call to reset permissions for this token failed");
            }

            var identityForLoggedOnUser = new WindowsIdentity(duplicateToken);
            _impersonatedUserContext = identityForLoggedOnUser.Impersonate();
            if (_impersonatedUserContext == null)
            {
                throw new Exception("WindowsIdentity.Impersonate() failed");
            }
        }
        finally
        {
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (duplicateToken != IntPtr.Zero)
                CloseHandle(duplicateToken);
        }
    }

    private static IntPtr ValidateParametersAndGetFirstLoginToken(string user, string password)
    {
        if (string.IsNullOrEmpty(user))
        {
            throw new ConfigurationErrorsException("No user passed into impersonation class");
        }
        var userHaves = user.Split('\\');
        if (userHaves.Length != 2)
        {
            throw new ConfigurationErrorsException("User must be formatted as follows: domain\\user");
        }
        if (!RevertToSelf())
        {
            throw new Exception("RevertToSelf call to remove any prior impersonations failed");
        }

        IntPtr token;

        var result = LogonUser(userHaves[1], userHaves[0],
                               password,
                               LogonSessionType.Interactive,
                               LogonProvider.Default,
                               out token);
        if (!result)
        {
            throw new ConfigurationErrorsException("Logon for user " + user + " failed.");
        }
        return token;
    }
    /// <summary>
    /// Dispose
    /// </summary>
    public void Dispose()
    {
        // Stop impersonation and revert to the process identity
        if (_impersonatedUserContext != null)
        {
            _impersonatedUserContext.Undo();
            _impersonatedUserContext.Dispose();
            _impersonatedUserContext = null;
        }
    }
}

在此类的模拟块实例中,远程ini文件可通过以下方式访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int bufLen = GetPrivateProfileSectionNames(buffer, 
                                           buffer.GetUpperBound(0),     
                                           iniFileName);
if (bufLen > 0)
{
     //process results
}

如何让GetPrivateProfileSectionNames在处理远程计算机时返回有效数据?我的用户在此计算机或远程计算机上是否需要权限?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-10 17:23:27

在这一点上,我还没有找到关于模拟以及它如何与win32 dlls/apis交互的信息,但是,我知道以下内容:

1)如果整个进程在有权访问ini文件所在的远程文件夹的用户下运行,则GetPrivateProfileSectionNames会按预期工作

2)如果在模拟块内调用GetPrivateProfileSectionNames,则它不会按预期工作

3)如果打开了文件流,并且将ini文件复制到本地,则在本地ini文件上使用GetPrivateProfileSectionNames,则GetPrivateProfileSectionNames将按预期工作,并且允许该文件流访问远程文件。

根据结果,我推测win32 api调用GetPrivateProfileSectionNames没有从c#获得模拟上下文,因此运行在没有访问权限的整个进程上下文中。我解决了这个问题,方法是将ini文件缓存在本地,并跟踪它最后一次更改的时间,这样我就可以知道ini文件是否需要重新缓存,或者本地副本是否正确。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17537099

复制
相关文章
IL3000:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用嵌入在单文件捆绑包内的程序集的 Assembly.Location 属性将始终返回空字符串。
呆呆
2022/02/26
5140
IL3001:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如,通过将项目中的 PublishSingleFile 属性设置为 true)时,为单文件捆绑包内嵌入的程序集调用 Assembly.GetFile(s) 方法将始终引发异常,因为这些方法与单文件不兼容。
呆呆
2022/02/26
4870
[快学Python3]INI文件读写
概述 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 ini“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 其基本组成形式如下: [section_1] key1 = value1 key2 = value2 key3 = value3 key4 = value4 [section_2] key1 = value1 key2 = value2 key3 = value3 ke
苦叶子
2018/04/09
2.3K0
大文件复制时块的取值问题
小文件复制时使用File.Copy()方法非常方便,但在程序中复制大文件系统将处于假死状态(主线程忙于复制大量数据),你也许会说使用多线程就可以解决这个问题了,但是如果文件过大,没有显示复制时的进度就会让用户处于盲目的等待中。下面的示例使用文件流分块形式复制文件解决这个问题,但发现块的大小选择很关键且速度好像还是没有直接使用Windows中自带的复制速度快:
张果
2022/05/09
9570
大文件复制时块的取值问题
[快学Python3]INI文件读写
概述 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 ini“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 其基本组成形式如下: [section_1] key1 = value1 key2 = value2 key3 = value3 key4 = value4 [section_2] key1 = value1 key2 = value2 key3 = value3 ke
苦叶子
2018/04/09
1.3K0
[快学Python3]INI文件读写
概述 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 ini“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 其基本组成形式如下: [section_1] key1 = value1 key2 = value2 key3 = value3 key4 = value4 [section_2] key1 = value1 key2 = value2 key3 = value3 ke
苦叶子
2018/04/09
1.4K0
IL3002:当发布为单个文件时,避免调用
将应用发布为单个文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用使用 RequiresAssemblyFilesAttribute 属性注释的成员与单文件不兼容。 这些调用可能不兼容,因为使用此属性注释的成员要求程序集文件位于磁盘上,而嵌入单文件应用的程序集已加载到内存中。
呆呆
2022/02/26
4580
ini配置文件以及利用python管理ini文件
在python里面有一个叫做configparser的module,可以用来操作ini文件,从而方便进行配置文件的管理工作.
qsjs
2021/03/04
1.7K0
PHP中的php.ini文件详解 原
php.ini是PHP的初始化配置文件,该文件下内容非常多,进行个性化配置并不方便,所以在进行LNMP环境搭建时我们并没有完全使用它,只使用了其中默认开启的部分配置(该部分配置必须保留,所以PHP配置文件目录下必须有该文件),那么,该文件下到底都包含什么内容呢?小白出于好奇,整理如下:
阿dai学长
2019/04/03
3.7K0
python 读写ini文件
如果某个section已经存在了,在写入的时候不能够再使用config.add_section(‘Title1’)这个函数了,这样会报错,所以,我们需要进行判断,先判断Title1是否存在,然后再进行操作 例子:
matinal
2023/10/14
2290
ini 文件操作指南
  ini 类型文件通常作为程序的初始化文件。不同于我们常见的配置文件通篇 key-value 的键值对形式,ini 文件在键值对的基础之上还有分类节点,比如我们常见的 Mysql 数据库的初始化配置文件 my.cnf或my.ini,其内容格式通常是如下这样的:
用户1615728
2019/10/19
2K0
ini 文件操作指南
liunx下选择文件大小为0的文件(find)
修改对应的 -size 参数就可以查找指定大小的文件,如1k大小的文件(注意不要用 -size 1k,这个得到的是占用空间1k,不是文件大小1k的)
Laikee
2022/04/25
3.3K0
[20161111]数据文件的第0块2.txt
–如果数据文件的第0块是OS块信息,以前的测试如果rman做备份集都不会备份。 –如果这块损坏,里面讲问题不大,你甚至可以不修复,如果在线resize就ok了,当然重建控制文件就出现问题。
全栈程序员站长
2022/07/19
1940
神秘的.user.ini文件
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置 LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。 .user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini 可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。 删除的话rm -f /网站目录/.user.ini 就可以。 修改完成后再执行:chattr +i /网站目录/.user.ini .user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。 如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!! LNMP 1.4或更高版本如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。 LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除。 在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。 LNMPA或LAMP 模式1.2版本或更高版本的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要防跨目录设置可以在 php_admin_value open_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。 重启apache生效。
双面人
2020/03/23
2.1K0
.user.ini文件的坑
最后查到问题出在php的配置上,主要是因为配置了open_basedir项目,但是找遍了php.ini和php-fpm.conf也没有找到哪里设置了这个配置项,最后在看一个回答的时候,发现项目根目录可以放一个.user.ini文件来设置允许php访问的目录。
ianzhi
2019/07/31
1.5K0
怎么新建pytest的ini文件_pytest.ini配置
pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行
全栈程序员站长
2022/09/16
1.3K0
Pytest(十一) pytest ini文件
我们在执行的时候,可以不增加这些参数,addopts就是我们运行的时候所最近的命令
雷子
2022/04/06
1.5K0
Pytest(十一) pytest ini文件
【vbs】vbs写ini文件
这两天在折腾给一个项目打安装包,第一次接触软件打包,用的Advanced Installer(以下简称AI),应该说如果安装过程没有特殊动作(常规动作指释放文件、写注册表、建快捷方式等)的话,倒挺傻瓜的,按照向导和界面操作就能打好一个包。但我的安装动作包括:
AhDung
2018/09/13
1.8K0
C# 读写Ini文件
ini文件在Win95以前比较盛行,之后由于出册表等技术的出现,ini技术主键退居二线,不过对于一些小项目,读写ini文件还是很适用的。
用户9127601
2021/11/01
1.7K0
mybatis当传入数据类型为Int时并且值为0时,会判断为空字符串
今天在mbatis中使用Xml配置sql语句时,出现了这样一个问题。当我传入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误。
botkenni
2022/06/01
3.6K0

相似问题

GetPrivateProfileSectionNames始终返回0

11

当我运行"ometpp.ini“文件时,模拟提示:

15

替换ini文件中的块文本

14

如何读取远程INI文件

32

powershell远程创建ini文件

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文