我已经得到完全随机的异常,我可以运行同一套代码1000次(每次“运行”是该计划的一个完整的端到端于是开始从命令行自身的过程,然后存在),并把它失败一次,或甚至150倍。 我的意思是,我可以背背一遍又一遍运行它,它会完全随机失败。
System.Security.AccessControl.PrivilegeNotHeldException: The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation.
at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
at System.Security.AccessControl.RegistrySecurity..ctor(SafeRegistryHandle hKey, String name, AccessControlSections includeSections)
at Microsoft.Win32.RegistryKey.GetAccessControl(AccessControlSections includeSections)
我不能让它调试试图了解为什么它随机决定失败,因此我有问题时失败。 由于其内部的失败(RegistryKey).GetAccessControl(AccessControlSections.All)
方法,我很为难,以我应该尝试下什么。
另外,我通过循环多个键,如果它决定会失败,此许可例外的一个,他们都失败这一进程。
我是从命令行中运行(如管理员,UACed中),起动过程,然后它的存在。 从相同的命令行我重新开始的过程中,它会随机失败。
我加载用户荨麻疹,并确保注册表权升高,和它的作品,除了这种随机错误。
另外,(PSEXEC)和管理员帐户出现在多台机器(始终在本地运行远程,没有)的问题,这两个系统下。
我不认为该系统的帐户启用SeSecurityPrivilege权限,或为这一问题的管理。
而不是(RegistryKey).GetAccessControl(AccessControlSections.All)
尝试: (RegistryKey).GetAccessControl(AccessControlSections.Access)
这是否仍让你的错误? 您将无法使用得到的SACL Access
虽然。
编辑:我一把抓起PInvoke的一些代码在访问令牌调整的特权,你需要管理员权限才能做到这一点; 我修改它SeSecurityPrivilege权限,你应该能够使用(RegistryKey).GetAccessControl(AccessControlSections.All)
现在一次都没有任何错误“SetPriv();” 叫做。 我可以验证它是通过使用过程黑客2和前,后检查的标记,但使SeSecuirtyPrivilege工作:
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr
phtok);
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name,
ref long pluid);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
internal const string SeSecurity = "SeSecurityPrivilege";
private bool SetPriv()
{
try
{
bool retVal;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
retVal = LookupPrivilegeValue(null, SeSecurity, ref tp.Luid);
retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
return retVal;
}
catch (Exception ex)
{
throw;
return false;
}
}
文章来源: C# Random Exception when Getting / Setting Registry ACL “SeSecurityPrivilege”