2013-04-14 2 views
12

ReSharper предупреждает меня о возможном NullReferenceException вможет WindowsIdentity.GetCurrent() return null?

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

Я посмотрел в MSDN документ, но не видел ни одного упоминания об этом. Кроме того, это не имеет смысла, поскольку, если вы запускаете исполняемый файл, вы должны войти в систему.
Это просто шаблон поиска ReSharper?

ответ

19

Использование 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.

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. 
} 
1

Согласно разборке, null может быть возвращен.

См: GetCurrentInternal(TokenAccessLevels desiredAccess, bool threadOnly)

Отказ от ответственности: Я слишком ленив, чтобы рассекать определенное условие :)

5

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> 

Однако я Я также получаю предупреждение о возможном исключении NullReferenceException в WindowsIdentity.GetCurrent(). По какой-то причине ReSharper не распознает свои собственные внешние атрибуты аннотации. Если это известная ошибка или если есть проблема с этой проблемой, ответьте.

+2

хорошо, я гугле это для вас :) Это, кажется, наш маленький друг: http://youtrack.jetbrains.com/issue/RSRP-328266 – Noich

+0

Ровно.Вышеупомянутые аннотации предполагают исправить 328266 (следовательно, комментарий в первой строке фрагмента XML), но по какой-то причине исправление, похоже, не работает. Если это указывает на проблему в настройках или конфигурации R #, пожалуйста, уточните. –

+0

Я действительно понятия не имею :) Вам придется взять это с помощью QA. – Noich