Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C控制台应用程序中获取当前Windows用户名?_C#_Console Application - Fatal编程技术网

C# 如何在C控制台应用程序中获取当前Windows用户名?

C# 如何在C控制台应用程序中获取当前Windows用户名?,c#,console-application,C#,Console Application,我的问题是: 我正在开发一个独立的控制台应用程序,它必须找到当前登录的活动Windows用户名 测试用例: 多个用户登录,只有一个用户处于活动状态 一个用户当前处于活动状态,同时访问其他远程用户 远程用户中的其他用户与当前处于活动状态的用户相同 登录顺序可能有所不同,但在所有情况下,只需要当前活动用户 我找到了上述任务的以下代码: 字符串UserName1=System.Security.Principal.WindowsIdentity.GetCurrent.Name;//授予NT权限\系统

我的问题是:

我正在开发一个独立的控制台应用程序,它必须找到当前登录的活动Windows用户名

测试用例:

多个用户登录,只有一个用户处于活动状态

一个用户当前处于活动状态,同时访问其他远程用户

远程用户中的其他用户与当前处于活动状态的用户相同

登录顺序可能有所不同,但在所有情况下,只需要当前活动用户

我找到了上述任务的以下代码:

字符串UserName1=System.Security.Principal.WindowsIdentity.GetCurrent.Name;//授予NT权限\系统 字符串UserName2=Request.LogonUserIdentity.Name;//授予NT权限\系统 字符串UserName3=Environment.UserName;//给出系统 字符串UserName4=HttpContext.Current.User.Identity.Name;//提供实际登录的用户,如中所示 字符串UserName5=System.Windows.Forms.SystemInformation.UserName;//给出系统 字符串DisplayName=System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName 我知道HttpContext并不是纯粹基于控制台的,但如果它满足条件并具有可比性,我将使用它

我不知道所有可能的测试用例,也无法测试它们

我不确定哪一个适合我所有的测试用例

我将接受任何符合需要的解决方案

帮我找到可能的方法


抱歉出现任何错误,感谢您的帮助。

我已将C代码转换为C并实现了它

公共静态类UserInfo { 平沃克区 [DllImportwtsapi32.dll,SetLastError=true] 静态外部Int32 WTSEnumerateSessions IntPtr服务器, [MarshalAsUnmanagedType.U4]保留Int32, [MarshalAsUnmanagedType.U4]Int32版本, 参考IntPtr ppSessionInfo, [MarshalAsUnmanagedType.U4]参考Int32 pCount; [DllImportwtsapi32.dll] 静态外部无效WTSFreeMemoryIntPtr pMemory; [StructLayoutKind.Sequential] 私有结构WTS\u会话\u信息 { 公共Int32会话ID; [MarshalAsUnmanagedType.LPStr] 公共字符串pInstallationName; 公共WTS_CONNECTSTATE_CLASS State; } 公共枚举WTS_连接状态_类 { 是的, WTS连接, WTSConnectQuery, WTSShadow, WTS断开连接, 西德尔, WTSListen, WTSReset, WTSDown, WTSInit } [DllImportWtsapi32.dll] 公共静态外部bool wtsquerysessioninformationtptr hServer,int sessionId,WTSInfoClass WTSInfoClass,out IntPtr ppBuffer,out uint pbytes返回; 公共枚举WTSInfoClass { 中国程序, WTS应用程序名称, WTSWorkingDirectory, WTSOEMId, WTSSessionId, 苏瑟南, WTSWinStationName, WTSDomainName, WTS连接状态, WTSClientBuildNumber, WTSClientName, WTSClientDirectory, WTSClientProductId, WTSClientHardwareId, WTSClientAddress, WTSClientDisplay, WTSClientProtocolType, 在这段时间里, 那时候, wtsincoming字节, WTSOutgoingBytes, 未来的框架, WTSOutgoingFrames, WTSClientInfo, WTSSessionInfo } [旗帜] 公共枚举LocalMemoryFlags { LMEM_固定=0x0000, LMEM_可移动=0x0002, LMEM_NOCOMPACT=0x0010, LMEM_NODISCARD=0x0020, LMEM_ZEROINIT=0x0040, LMEM_MODIFY=0x0080, LMEM_可丢弃=0x0F00, LMEM_有效_标志=0x0F72, LMEM_无效_句柄=0x8000, LHND=LMEM_可移动| LMEM_零初始, LPTR=LMEM_固定| LMEM_零初始, 非ZerolHnd=LMEM_可移动, 非零LPTR=LMEM_固定 } [DllImportkernel32.dll] 静态外部IntPtr本地许可uFlags、UIntPtr uBytes; [DllImportkernel32.dll,SetLastError=true] 静态外部IntPtr LocalFreeIntPtr hMem; [DllImportkernel32.dll,入口点=CopyMemory,SetLastError=false] 公共静态外部无效copymoryintptr dest、IntPtr src、uint count; 端区平沃克 区域辅助方法 公共静态bool GetPhysicallyLogedOnUserName输出字符串PhysicallyLogedOnUserName,输出字符串DomainName { PhysicallyLoggedOnUserName=string.Empty; DomainName=string.Empty; IntPtr WTS_CURRENT_SERVER_HANDLE=IntPtrnull; 尝试 { IntPtr ppSessionInfo=IntPtr.Zero; Int32 pCo unt=0; Int32 retval=WTSEnumerateSessionsWTS_当前_服务器_句柄,0,1,ref ppSessionInfo,ref pCount; Int32 dataSize=Marshal.sizeoftypeoffts\u SESSION\u INFO; 如果返回!=0 { Int64当前=intppSessionInfo; int totalactiveuser=0; 对于int i=0;i多个用户登录且只有一个用户处于活动状态,登录不表示处于活动状态?或者他们已经注销了?我不太明白你的想法是什么question@Raynoceros假设我有两个用户A和B,第一次登录到用户A,然后将用户切换到B,用户A的应用程序仍在运行,但现在我需要用户B,因为它是活动的。如果我在B也在运行时切换回用户A,我想要A现在这是某种测试问题还是作业?如果您想找到当前的活动用户,首先我们必须了解您的登录代码是如何工作的。显示您登录部分的代码,然后我们可以帮助您。您提到,当您从B切换回A并且您想要A时,切换部分的代码已经是您答案的关键。我看到了混淆,用户是windows用户,而不是我应用程序的用户