14

ReSharper 警告我可能NullReferenceException

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

我查看了 MSDN 文档,但没有看到任何提及这一点。此外,这没有任何意义,因为如果您运行可执行文件,则必须登录。

这只是 ReSharper 搜索模式吗?

4

4 回答 4

21

使用 ILSpy ,您可以查看GetCurrent和调用的反编译版本。GetCurrentInternalGetCurrent

获取电流:

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

获取当前内部:

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调用 from 时始终为 false GetCurrent,并且 thecurrentToken必须对其他 return 语句有效,因此我认为您没有获得 null 的风险WindowsIdentity

于 2013-04-14T12:14:10.993 回答
6

ReSharper应该处理这个问题。

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

于 2013-04-23T18:05:50.990 回答
2

这听起来像是来自 ReSharper 的虚假报告。

MSDN 页面GetCurrent没有提及在null任何情况下返回。

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

它可以引发 a 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.
}
于 2013-04-14T11:19:43.983 回答
1

根据拆机情况,null可退换。

看:GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)

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

于 2013-04-14T11:28:26.550 回答