目錄
- 1. 使用者賬戶名稱 - 使用Environment類
- 2. 使用者賬戶資訊 - 使用WindowsIdentity和IdentityReference
- 3. 使用IPrincipal判斷使用者賬戶類型(支援使用者賬戶控制(UAC)提示)
返回目錄
1. 使用者賬戶名稱 - 使用Environment類
使用Environment可以返回當前系統內容的一些常用資訊,其中包括使用者賬戶名稱,則不需要額外使用System.Security.Principal中的類。
//使用者名稱
Console.WriteLine(Environment.UserName);
//電腦NetBIOS名稱
Console.WriteLine(Environment.MachineName);
//電腦網路網域名稱稱
Console.WriteLine(Environment.UserDomainName);
這是我的電腦的相應資訊:
Mgen
MGEN-PC
Mgen-PC
這些資訊也可以在電腦屬性中查看:
返回目錄
2. 使用者賬戶資訊 - 使用WindowsIdentity和IdentityReference
System.Security.Principal.IIdentity介面是用來定義標識對象的準系統,其衍生類別WindowsIdentity則直接代表著一個Windows的使用者賬戶。用此類我們可以擷取相關使用者資訊。
同時System.Security.Principal.IdentityReference代表一個標識,其衍生類別NTAccount和SecurityIdentifier類可以分別代表賬戶全稱和安全性識別碼 (SID)。不同IdentityReference可以通過Translate方法進行類型轉換。
//注意:using System.Security.Principal;
//獲得當前Windows使用者
WindowsIdentity curUser = WindowsIdentity.GetCurrent();
//使用者SID
SecurityIdentifier sid = curUser.User;
//使用者全稱
NTAccount ntacc = (NTAccount)sid.Translate(typeof(NTAccount));
Console.WriteLine(sid.Value);
Console.WriteLine(ntacc.Value);
輸出:
S-1-5-21-2376214308-3361272619-2153758801-1000
Mgen-PC\Mgen
返回目錄
3. 使用IPrincipal判斷使用者賬戶類型(支援使用者賬戶控制(UAC)提示)
System.Security.Principal.IPrincipal介面代表定義使用者物件的準系統,其衍生類別WindowsPrincipal可以理解為代表Windows使用者賬戶的許可權或者使用者類型。IPrincipal規定方法IsInRole(string role)來判斷使用者是否屬於指定的類型/角色。WindowsPrincipal類不僅實現了IPrincipal要求的IsInRole方法(參數是字串),還重載了基於WindowsBuiltInRole枚舉的IsInRole方法。WindowsBuiltInRole(MSDN:http://msdn.microsoft.com/zh-cn/library/system.security.principal.windowsbuiltinrole.aspx)包含了常見的Windows使用者賬戶類比如:管理員,超級使用者,使用者,來賓使用者……
當然IPrincipal是建立在IIdentity之上的,即只有知道了使用者標識,才可以知道使用者的準系統。IPrincipal的Identity屬性就返回IIdentity對象。當然派生的WindowsPrincipal則返回WindowsIdentity,後者則是IIdentity的衍生類別。
另外在Windows Vista,Windows 7和之後的Windows系統引入了使用者賬戶控制(UAC:User Account Control),即便使用者是管理員賬戶,系統彷彿並不會將此使用者啟動並執行程式作為管理員權限而運行(Vista之前的系統是這樣做的),任何可能影響系統安全的操作都會直接顯示在螢幕上讓使用者判斷是否可以繼續,當使用者同意執行後,該操作才可以以管理員方式進行。這樣大大減少了某些惡意程式的幕後運行,因為很多惡意程式往往是費盡周折得到管理員權限運行後就可以為所欲為了。
下面這段代碼可以判斷利用WindowsPrincipal來判斷使用者是否具有管理員權限,運行後使用者賬戶控制會提示是否給予程式管理員權限。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Security.Principal;
namespace Mgen.TTC
{
class Program
{
static void Main()
{
WindowsPrincipal winPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
bool admin = winPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
if (!admin)
{
if (!RunUAC(Process.GetCurrentProcess().MainModule.FileName))
{
Console.WriteLine("不是管理員");
return;
}
}
Console.WriteLine("是管理員");
}
static bool RunUAC(string fileName)
{
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = fileName;
try
{
Process.Start(processInfo);
return true;
}
catch (System.ComponentModel.Win32Exception)
{ }
return false;
}
}
}