可以WindowsIdentity.GetCurrent()返回null?(can WindowsI

2019-08-22 23:34发布

ReSharper的警告我关于一个可能NullReferenceException

WindowsIdentity windowsIdentity = new WindowsIdentity(WindowsIdentity.GetCurrent().Token);

我看着在MSDN文档,但没有看到这个任何提及。 此外,因为如果你运行一个可执行文件,你必须要登录它没有任何意义。
这只是一个ReSharper的搜索模式?

Answer 1:

使用ILSpy,你可以看看去编译版本GetCurrentGetCurrentInternal ,这GetCurrent电话。 其结果是:

GetCurrent:

    public static WindowsIdentity GetCurrent()
    {
        return WindowsIdentity.GetCurrentInternal(TokenAccessLevels.MaximumAllowed, false);
    }

GetCurrentInternal:

internal static WindowsIdentity GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)
{
    int errorCode = 0;
    bool flag;
    SafeTokenHandle currentToken = WindowsIdentity.GetCurrentToken(desiredAccess, threadOnly, out flag, out errorCode);
    if (currentToken != null && !currentToken.IsInvalid)
    {
        WindowsIdentity windowsIdentity = new WindowsIdentity();
        windowsIdentity.m_safeTokenHandle.Dispose();
        windowsIdentity.m_safeTokenHandle = currentToken;
        return windowsIdentity;
    }
    if (threadOnly && !flag)
    {
        return null;
    }
    throw new SecurityException(Win32Native.GetMessage(errorCode));
}

由于threadOnly从打电话时总是假GetCurrentcurrentToken必须为其他return语句是有效的,我不认为你在得到一个零风险WindowsIdentity



Answer 2:

ReSharper的对此进行处理。

在目录<ReSharper的安装目录> \ V7.1 \ BIN \ ExternalAnnotations \ .NETFramework \ mscorlib程序,外部注解文件Nullness.Manual.xml定义了以下注释:

<!-- RSRP-328266 -->
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent">
  <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent(System.Boolean)">
  <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
    <argument>false=&gt;notnull</argument>
  </attribute>
</member>
<member name="M:System.Security.Principal.WindowsIdentity.GetCurrent(System.Security.Principal.TokenAccessLevels)">
  <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>

不过,我也得到警告有关WindowsIdentity.GetCurrent可能NullReferenceException异常()。 出于某种原因,ReSharper的是不承认自己的外部注释属性。 如果这是一个已知的bug,或者是否有针对此问题的一个解决方法,请回复。



Answer 3:

这听起来像一个ReSharper的不实报道。

在为MSDN页面GetCurrent只字不提返回的null在任何情况下。

正如您指出的,必须有一个当前用户(的一种或另一种),所以这应该总是返回一个有效的对象 - 如果你拥有的权限。

它可以提高一个SecurityException ,但是这是一个不同的错误,你的代码无论如何都会失败。 如果这是一个可能性,那么你可能要重新安排你的代码:

WindowsIdentity currentIdentity = null;
try
{
    currentIdentity = WindowsIdentity.GetCurrent();
    // Carry on if there's nothing you can do
    WindowsIdentity newIdentity = new WindowsIdentity(currentIdentity.Token);
}
catch (SecurityException ex)
{
    // Do something, logging, display error etc.
}


Answer 4:

据拆卸, null可以返回。

请参阅: GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)

免责声明:我是懒得仔细分析具体病情:)



文章来源: can WindowsIdentity.GetCurrent() return null?