Вход в Excel
Но мне нужно сделать это программно. Исследования привели меня к библиотеке ADOMD.NET. Я пробовал использовать его несколькими способами, но не смог заставить его работать.
Сначала я попробовал этот фрагмент C# (.NET 8):
Код: Выделить всё
using Microsoft.AnalysisServices.AdomdClient;
try {
using (AdomdConnection conn = new("Data Source=bi.mycompany.com; Initial Catalog=MyDb; UID=mycompany\\service.user; PWD=pass")) {
conn.Open();
Console.WriteLine(conn.ServerVersion);
foreach (var cube in conn.Cubes) {
Console.WriteLine(cube.Name);
}
conn.Close();
}
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
Console.WriteLine("Press any key");
Console.ReadKey();
}
Microsoft.AnalysisServices.AdomdClient.AdomdErrorResponseException: у пользователя «MYCOMPANY\my.user» нет доступ к базе данных «MyDB» или базе данных не существует.
Обратите внимание, что в ошибке указано «MYCOMPANY\my.user», который я использую для входа на свой компьютер с Windows, а не «служба». .пользователь". После некоторого поиска в Google я обнаружил, что ADOMD.NET игнорирует UID и PWD и использует текущего вошедшего в систему пользователя для аутентификации запросов к SSAS. Чтобы обойти эту проблему, было предложено выдать себя за service.user, что я и попытался сделать следующим образом (это было создано с помощью ИИ, но выглядит аналогично другим сообщениям):
Код: Выделить всё
class Program
{
// Correct P/Invoke for LogonUser
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false, ThrowOnUnmappableChar = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
public static void Main()
{
string username = "service.user";
string password = "pass";
string domain = "mycompany";
IntPtr tokenHandle = IntPtr.Zero;
// Use LogonUser to authenticate the other user
bool success = LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out tokenHandle);
if (success)
{
// Create a WindowsIdentity using the token
using (WindowsIdentity identity = new WindowsIdentity(tokenHandle))
{
// Run code as the impersonated user
WindowsIdentity.RunImpersonated(identity.AccessToken, () =>
{
try
{
// Open the AdomdConnection under the impersonated user's context
using (AdomdConnection conn = new AdomdConnection("Data Source=bi.mycompany.com; Initial Catalog=MyDb"))
{
conn.Open();
Console.WriteLine("Connection opened successfully as " + identity.Name);
Console.WriteLine(conn.ServerVersion);
}
}
catch (Exception ex)
{
Console.WriteLine("Failed to connect: " + ex.Message);
}
});
}
// Clean up: Close the token handle
CloseHandle(tokenHandle);
}
else
{
Console.WriteLine("LogonUser failed. Error: " + Marshal.GetLastWin32Error());
}
}
}
Необработанное исключение. System.IO.FileNotFoundException:
Имя файла: «Microsoft.AnalysisServices.AdomdClient, Version=19.86.2.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91»
Я попробовал предоставить разрешение на чтение и Выполните разрешения для service.user в моей папке .nuget, как предложено здесь, но возникла та же ошибка.
Можно ли программно подключиться к SSAS с другим пользователем так же, как я могу подключиться используя Excel?
Кроме того, этот код в конечном итоге будет работать на компьютере с Linux, будет ли он там работать?
Подробнее здесь: https://stackoverflow.com/questions/790 ... dows-login