Я знаю, что много вопросов о SO аналогично этому, но я не мог найти его для этой конкретной проблемы.
Несколько точек, во-первых:
- У нас есть без контроля на нашем сервере Sharepoint. Я не могу настроить любые настройки IIS.
 - Я считаю, что наша версия сервера IIS - IIS 7.0.
 - Наш сервер Sharepoint ожидает запросы через NTLM.
 - Наш сервер Sharepoint находится в том же домене, что и мой клиентский компьютер.
 - Я использую .NET Framework 3.5, Visual Studio 2008
 
Я пытаюсь написать простое консольное приложение для управления данными Sharepoint с помощью веб-служб SharePoint. Я добавил ссылку на службу, а следующий мой app.config:
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="Transport">
                    <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://subdomain.companysite.com/subsite/_vti_bin/Lists.asmx"
            binding="basicHttpBinding" bindingConfiguration="ListsSoap"
            contract="ServiceReference1.ListsSoap" name="ListsSoap" />
    </client>
</system.serviceModel>
Это мой код:
static void Main(string[] args)
{
    using (var client = new ListsSoapClient())
    {
        client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
        client.GetListCollection();
    }
}
Когда я вызываю GetListCollection(), вызывается следующее MessageSecurityException:
The HTTP request is unauthorized with client authentication scheme 'Ntlm'.
The authentication header received from the server was 'NTLM'.
С внутренним WebException:
"The remote server returned an error: (401) Unauthorized."
Я пробовал различные привязки и различные настройки кода, чтобы попытаться аутентифицироваться должным образом, но безрезультатно. Я приведу список ниже.
Я пробовал следующие шаги:
Использование собственного Win32 Impersonator перед созданием клиента
using (new Impersonator.Impersonator("username", "password", "domain"))
using (var client = new ListsSoapClient())
{
    client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("dpincas", "password", "domain");
    client.GetListCollection();
}
Это вызвало то же сообщение об ошибке.
Настройка TokenImpersonationLevel для моих учетных данных клиента
using (var client = new ListsSoapClient())
{
    client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
    client.GetListCollection();
}
Это вызвало то же сообщение об ошибке.
Использование режима безопасности = TransportCredentialOnly
<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" />
</security>
В результате появилось другое сообщение об ошибке:
The provided URI scheme 'https' is invalid; expected 'http'.
Parameter name: via
Однако мне нужно использовать https, поэтому я не могу изменить схему URI.
Я пробовал некоторые другие комбинации, которые я не помню, но я опубликую их, когда буду. Я действительно нахожусь здесь. Я вижу много ссылок на Google, которые говорят "переключитесь на Kerberos", но мой сервер, похоже, принимает NTLM, а не "Negotiate" (как было бы сказано, если он ищет Kerberos), так что, к сожалению, это не вариант.
Любая помощь там, люди?