首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当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

复制
相关文章
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
Gitlab 提供了基于 Code Climate 的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml 中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
崔秀龙
2019/07/22
8.1K0
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
在python环境调用C库
注意: 如果返回是无符号长类型, 需要在py里面设置返回类型 t1.restype = ctypes.POINTER(ctypes.c_ulong) 其它类型同理
大大刺猬
2022/09/29
5710
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
关于MrKaplan  MrKaplan是一款功能强大的红队安全研究工具,该工具可以帮助广大红队研究人员清理和隐藏活动中的代码执行痕迹。该工具可以通过保存文件运行时间、存储文件快照等信息来辅助红队活动,并将所有的取证信息与相关用户关联起来。  功能介绍  1、关闭系统事件日志记录功能; 2、清理文件和代码组件; 3、清理注册表; 4、支持多用户运行; 5、支持以普通用户或管理员身份运行(建议以管理员权限运行); 6、支持保存文件时间戳; 7、支持排除指定操作,并将组件留给蓝队人员。  工具下载  该工具本质
FB客服
2023/03/30
1.8K0
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
在 Node 中调用 Python
在 Node 中如何调用 Python 的方法?通常可以通过 REST 接口或者 RPC 的方式来完成,但是某些时候我们仅仅只需要调用对方几个很简单的方法,这种情况下去构建一个提供 REST 接口的服务或者两者对接实现 RPC 调用,这种做法的成本显然有点高。本文将会介绍一种更轻量的调用方式。
凌虚
2020/07/17
5.7K0
在Java中调用Python
在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。
编程随笔
2019/09/11
5.1K0
在Java中调用Python
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
全栈程序员站长
2022/07/05
1.9K0
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
欢醉
2018/01/22
2.3K0
生产环境日志清理脚本
生产上有40多个微服务部署的应用,每个应用都会产生日志,随着时间的增长,日志量不断增大,现需要清理。有两个重要的应用日志需保留90天,其它应用保留20天。
loong576
2020/07/20
1.2K0
在C++中调用Python
虽然现在Python编程语言十分的火爆,但是实际上非要用一门语言去完成所有的任务,并不是说不可以,而是不合适。在一些特定的、对于性能要求比较高的场景,还是需要用到传统的C++来进行编程的。但是C++的一个缺点是比较难找到很好的轮子,这也是很多人专用Python的一个重要原因。这篇文章我们要介绍的是一个比较特殊的场景——用C++的代码去调用Python函数中实现的一些功能。这样的话,如果代码的主体还是用C++完成的,而部分功能为了简便,引入一些Python中已经封装好的函数,这样就可以很好的结合两种语言各自的特点。而另一种工作方式:通过Python来调用一些C++或者Fortran中实现的高性能函数,可以参考这一篇博客。这两种不同的使用方法各有优劣,但是如果以Python为主导,就很难避开GIL的问题,这里我们就不过多的展开。
DechinPhy
2021/05/27
4.1K0
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.2K0
清理垃圾bat代码
rd /s /q %windir%\temp & md %windir%\temp
全栈程序员站长
2022/07/04
1K0
清理垃圾bat代码
在Oracle中,如何定时清理INACTIVE状态的会话?
今天小麦苗给大家分享的是在Oracle中,如何定时清理INACTIVE状态的会话?
AiDBA宝典
2019/09/29
2.7K0
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
用户2781897
2021/04/02
6550
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/11
5780
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/22
3.5K0
在OrderStatusActor构造方法中调用StartTimerAsync
TimerCallbackAsync方法以二进制形式接收用户状态。 在示例中,回调在将状态写入日志之前将状态 string 解码回 。
用户7108768
2021/09/26
1.9K0
Go语言在模版中调用函数
如果希望调用自定义函数,需要借助html/template包下的FuncMap进行映射
IT工作者
2022/03/31
2.8K0
如何成功清理重建CloudStack环境
很多玩过 CloudStack的童鞋,或多或少在刚刚入门 CloudStack的时候,对一个搭建环境需要做N多次的创建,删除才能最终运行好一个云环境,但是在这个过程中,如果遇到问题,找不出其他方法解决的话,很多新手暂时能够想到的就是重新创建环境,在这个过程中,有几项注意点需要提醒各位,否则即使重建好了环境,也会由于某些配置的残留而导致新的环境出现新的问题。
星哥玩云
2022/06/28
5770
点击加载更多

相似问题

共享环境中的mod_perl调试

10

在mod_perl环境中使用共享内存

22

如何使用maven调用插件清理构建环境

12

mod_perl 2环境中的WebApp配置

10

清理Anaconda中的基础环境

144
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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