ReSharper的警告我关于一个可能NullReferenceException
在
WindowsIdentity windowsIdentity = new WindowsIdentity(WindowsIdentity.GetCurrent().Token);
我看着在MSDN文档,但没有看到这个任何提及。 此外,因为如果你运行一个可执行文件,你必须要登录它没有任何意义。
这只是一个ReSharper的搜索模式?
ReSharper的警告我关于一个可能NullReferenceException
在
WindowsIdentity windowsIdentity = new WindowsIdentity(WindowsIdentity.GetCurrent().Token);
我看着在MSDN文档,但没有看到这个任何提及。 此外,因为如果你运行一个可执行文件,你必须要登录它没有任何意义。
这只是一个ReSharper的搜索模式?
使用ILSpy,你可以看看去编译版本GetCurrent
和GetCurrentInternal
,这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
从打电话时总是假GetCurrent
和currentToken
必须为其他return语句是有效的,我不认为你在得到一个零风险WindowsIdentity
。
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=>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,或者是否有针对此问题的一个解决方法,请回复。
这听起来像一个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.
}
据拆卸, null
可以返回。
请参阅: GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)
免责声明:我是懒得仔细分析具体病情:)