2014-12-01 4 views
0

Я пытаюсь получить текущее имя пользователя в среде Windows, использующей проверку подлинности Windows. Код существует в библиотеке классов, которая построена и ссылается в виде отдельного приложения Visual Studio:My.User.CurrentPrincipal не работает в библиотеке классов

Function GetUserName() As String 
    If TypeOf My.User.CurrentPrincipal Is 
     Security.Principal.WindowsPrincipal Then 
     ' The application is using Windows authentication. 
     ' The name format is DOMAIN\USERNAME. 
     Dim parts() As String = Split(My.User.Name, "\") 
     Dim username As String = parts(1) 
     Return username 
    Else 
     ' The application is using custom authentication. 
     Return My.User.Name 
    End If 
End Function 

Я получаю сообщение об ошибке, когда он находится в библиотеке классов. My.User.CurrentPrincipal возвращается с {System.Security.Principal.GenericPrincipal} и My.User.Name пустым. Когда я помещаю тот же самый код в новое приложение форм Windows, он работает - My.User.CurrentPrincipal возвращается с {System.Security.Principal.WindowsPrincipal} и My.User.Name - это имя пользователя.

Документация Microsoft предполагает, что объект My.User будет работать в библиотеках классов. Кто-нибудь знает, почему я получаю разные значения, когда он помещается в библиотеку классов и добавляется как ссылка .dll на родительское приложение?

Родительское приложение представляет собой библиотеку классов, которая является надстройкой для Microsoft PowerPoint. Код в исходном приложении, которое вызывает приведенный выше код (так называемый UsageDataCollection.dll) является:

Public Class rbnOvaPowerPoint 
    Private DataCollector As UsageDataCollection.DataCollector 
    Private Sub butShare_Click(sender As Object, e As RibbonControlEventArgs) Handles butShare.Click 
     OtherTasks.CreateMailItem() 
    End Sub 
End Class 

И затем в отдельном модуле:

Module OtherTasks 
    Private DataCollector As New UsageDataCollection.DataCollector 
    Sub CreateMailItem() 
     Dim OutlookApp As Outlook._Application = CreateObject("Outlook.Application") 
     Dim mail As Outlook.MailItem = Nothing 
     Dim mailRecipients As Outlook.Recipients = Nothing 
     Dim mailRecipient As Outlook.Recipient = Nothing 
     DataCollector.UsageStatistics("CreateMailItem") 
     Try 
      mail = OutlookApp.CreateItem(Outlook.OlItemType.olMailItem) 
      mail.Subject = "OvaPowerPoint" 
      mail.Body = "Check out OvaPowerPoint, a custom-built Arup add-in for PowerPoint!" & Strings.Chr(13) & Strings.Chr(13) & "About the Add-In:" & Strings.Chr(13) & "http://wiki.oasys.intranet.arup.com/X-Wiki/index.php/OvaPowerPoint" & Strings.Chr(13) & Strings.Chr(13) & "Installation File:" & Strings.Chr(13) & "\\n-ynas12\Software\Custom%20Applications\Plug-Ins\Microsoft%20PowerPoint\OvaPowerPoint\setup.exe" 
      mail.Display(True) 
     Catch ex As Exception 
      System.Windows.Forms.MessageBox.Show(ex.Message, 
      "An exception is occured in the code of add-in.") 
     Finally 
      If Not IsNothing(mailRecipient) Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mailRecipient) 
      If Not IsNothing(mailRecipients) Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mailRecipients) 
      If Not IsNothing(mail) Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mail) 
     End Try 
    End Sub 
End Module 

И подпрограмме UsageStatistics в UsageDataCollection.dll выглядит :

Imports System.IO 
Imports System.Text 
    Public Class DataCollector 
    Public Sub UsageStatistics(myAction As String) 
     Dim myAssemblyName As String = System.Reflection.Assembly.GetCallingAssembly.GetName.Name 
     Dim myFilePath As String = "\\n-ywpress01\uploads\UsageData\" & myAssemblyName & ".csv" 
     Using LogFile As New StreamWriter(myFilePath, True) 
      LogFile.WriteLine("[" & DateTime.Now.ToUniversalTime.ToString("yyyy/MM/dd HH':'mm':'ss") & "]" & Chr(44) & GetUserName() & Chr(44) & GetUserLocation() & Chr(44) & myAction) 
      LogFile.Close() 
     End Using 
    End Sub 
End Class 

Благодаря

Zak

+0

С, где эта функция называется? –

+0

Привет Крис, сейчас он вызван из библиотеки классов, которая является надстройкой для Microsoft PowerPoint. Я отредактирую свой пост, чтобы включить в него некоторые подробности. – Zak

+0

Я выполнял некоторые тесты и обнаружил, что UsageDataCollection.dll работает, если на него ссылается приложение Windows Forms. Что-то происходит, когда я пытаюсь ссылаться на него в надстройке PowerPoint (которая принимает форму библиотеки классов) ... – Zak

ответ

0

В документации MS, он говорит

Для приложений для Windows, только проекты, построенные на шаблоне приложения Windows инициализировать My.User объект по умолчанию. Во всех других типах проектов Windows вы должны инициализировать объект My.User, вызвав метод My.User.InitializeWithWindowsUser явно или присвоив значение CurrentPrincipal.

Исправление в вашем коде:

Function GetUserName() As String 
    My.User.InitializeWithWindowsUser() 'pulls the network credentials into .NET 
    If TypeOf My.User.CurrentPrincipal Is 
     Security.Principal.WindowsPrincipal Then 
     ' The application is using Windows authentication. 
     ' The name format is DOMAIN\USERNAME. 
     Dim parts() As String = Split(My.User.Name, "\") 
     Dim username As String = parts(1) 
     Return username 
    Else 
     ' The application is using custom authentication. 
     Return My.User.Name 
    End If 
End Function 
Смежные вопросы