微信企业号,发消息或获取人员信息时报no privilege to access/modify contact/party/agent

微信企业号,发消息或获取人员信息时报no privilege to access/modify contact/party/agent  ,主要是没有权限访问或修改人员的信息等,研究后,其实只要将红圈部分的通讯录权限开通好,就可以了。


    微信企业号,是微信2014年推出的新产品,主要是针对企业进行管理的平台,企业号将在移动互联网上,为企业提供对内部员工的管理、沟通与服务。可以帮助企业建立员工、上下游供应链与企业 IT 系统间的连接。利用企业号 ,企业IT部门可以帮助企业快速、低成本的实现高质量的移动轻应用,实现生产、管理、协作、运营的移动化。已经建设了IT系统的企业可直接将现有IT系统接入微信企业号,既保留用户PC端使用习惯,又快速实现企业应用移动化。    本系列文章希望从一个循序渐进的角度,来介绍微信的相关开发过程和经验总结,希望给大家带来帮助,同时也为自己做好系统笔记 。


目录:

   1、C# 微信企业号--获取AccessToken

   2、C# 微信企业号--管理通讯录 之管理部门

   3、C# 微信企业号--回调模式

   4、C# 微信企业号--接收普通消息与事件

   5、C# 微信企业号--OAuth 2.0验证

   6、C# 微信企业号--发送消息

   7、C# 微信企业号--管理素材文件



好的,以下是 C# 实现 whoami /priv 命令并使用 LookupPrivilegeName 获取特权信息的完整代码: ``` using System; using System.Runtime.InteropServices; class Program { private const int SE_PRIVILEGE_ENABLED = 0x00000002; private const int TOKEN_QUERY = 0x00000008; private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; private const int MAX_NAME_LENGTH = 1024; [StructLayout(LayoutKind.Sequential)] public struct LUID { public uint LowPart; public int HighPart; } [StructLayout(LayoutKind.Sequential)] public struct LUID_AND_ATTRIBUTES { public LUID Luid; public uint Attributes; } [StructLayout(LayoutKind.Sequential)] public struct TOKEN_PRIVILEGES { public uint PrivilegeCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public LUID_AND_ATTRIBUTES[] Privileges; } [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle); [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool LookupPrivilegeName(string lpSystemName, IntPtr lpLuid, System.Text.StringBuilder lpName, ref int cchName); [DllImport("advapi32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, [MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, uint BufferLength, IntPtr PreviousState, IntPtr ReturnLength); static void Main(string[] args) { IntPtr currentProcessHandle = IntPtr.Zero; IntPtr tokenHandle = IntPtr.Zero; try { currentProcessHandle = System.Diagnostics.Process.GetCurrentProcess().Handle; if (!OpenProcessToken(currentProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out tokenHandle)) { Console.WriteLine("OpenProcessToken failed: " + Marshal.GetLastWin32Error()); return; } // Get the required buffer size for token privileges int tokenPrivilegesLength = 0; TOKEN_PRIVILEGES tokenPrivileges = new TOKEN_PRIVILEGES(); AdjustTokenPrivileges(tokenHandle, false, ref tokenPrivileges, 0, IntPtr.Zero, IntPtr.Zero); tokenPrivilegesLength = Marshal.SizeOf(tokenPrivileges); // Allocate memory for token privileges IntPtr tokenPrivilegesPtr = Marshal.AllocHGlobal(tokenPrivilegesLength); Marshal.StructureToPtr(tokenPrivileges, tokenPrivilegesPtr, false); // Enable all privileges tokenPrivileges.PrivilegeCount = 1; tokenPrivileges.Privileges = new LUID_AND_ATTRIBUTES[1]; LUID luid = new LUID(); if (!LookupPrivilegeValue(null, "SeDebugPrivilege", out luid)) { Console.WriteLine("LookupPrivilegeValue failed: " + Marshal.GetLastWin32Error()); return; } tokenPrivileges.Privileges[0].Luid = luid; tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; Marshal.StructureToPtr(tokenPrivileges, tokenPrivilegesPtr, false); if (!AdjustTokenPrivileges(tokenHandle, false, ref tokenPrivileges, tokenPrivilegesLength, IntPtr.Zero, IntPtr.Zero)) { Console.WriteLine("AdjustTokenPrivileges failed: " + Marshal.GetLastWin32Error()); return; } int nameLength = MAX_NAME_LENGTH; System.Text.StringBuilder nameBuilder = new System.Text.StringBuilder(nameLength); bool success = LookupPrivilegeName(null, ref luid, nameBuilder, ref nameLength); if (!success) { Console.WriteLine("LookupPrivilegeName failed: " + Marshal.GetLastWin32Error()); return; } Console.WriteLine("Enabled privileges:"); Console.WriteLine(nameBuilder.ToString()); } finally { if (tokenHandle != IntPtr.Zero) { Marshal.FreeHGlobal(tokenHandle); } if (currentProcessHandle != IntPtr.Zero) { Marshal.FreeHGlobal(currentProcessHandle); } } } } ``` 这段代码会输出当前进程启用的权限列表。其中,LookupPrivilegeName 函数通过一个 LUID(本地唯一标识符)来获取权限名称。这个 LUID 可以通过 LookupPrivilegeValue 函数获取。这里的代码演示了如何启用 SeDebugPrivilege获取当前进程的所有权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值