WindowsIdentity.GetCurrent()可以返回null吗?

时间:2013-04-14 11:07:29

标签: resharper windows-identity

ReSharper警告我可能{/ 1}}

NullReferenceException

我查看了MSDN文档,但没有看到任何提及此问题。此外,它没有意义,因为如果您运行可执行文件,则必须登录 这只是一个ReSharper搜索模式吗?

4 个答案:

答案 0 :(得分:19)

使用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));
}

由于threadOnlyGetCurrent进行调用时始终为false,并且currentToken必须对其他返回语句有效,因此我认为您无法获得null WindowsIdentity

答案 1 :(得分:5)

ReSharper 处理此问题。

在目录&lt; ReSharper install dir&gt; \ 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无法识别自己的外部注释属性。如果这是一个已知的错误,或者如果有解决此问题的方法,请回复。

答案 2 :(得分:2)

这听起来像ReSharper的错误报道。

MSDN page for 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.
}

答案 3 :(得分:1)

根据反汇编,可以返回null

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

免责声明:我懒得剖析具体情况:)