/// <summary> /// Check whether user can log on with the credential /// </summary> /// <param name="info">The detection information</param> public void CheckUsernamePassword(DetectionInfo info) { Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)); AddToClientList(client); ulong messageId; ulong sessionId; Guid clientGuid; NEGOTIATE_Response negotiateResp; if (!UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp)) { return; } try { Packet_Header header; LOGOFF_Response logoffResponse; client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("LOGOFF", header.Status); } } catch (Exception e) { // Swallow all exceptions when cleaning up. logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message); } }
/// <summary> /// Get local network information /// </summary> /// <param name="info">The detection information</param> /// <returns></returns> public NetworkInfo FetchLocalNetworkInfo(DetectionInfo info) { LogIPConfig(); NetworkInfo networkInfo = info.ContentServerNetworkInformation; #region Get local IP list networkInfo.LocalIpList = new List <IPAddress>(); foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) { if (adapter.OperationalStatus != OperationalStatus.Up) { continue; } if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet || adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || adapter.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet) { foreach (var ip in adapter.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { Smb2Client smb2Client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)); AddToClientList(smb2Client); try { smb2Client.ConnectOverTCP(SUTIpAddress, ip.Address); networkInfo.LocalIpList.Add(ip.Address); } catch (Exception ex) { logWriter.AddLog( LogLevel.Information, string.Format("Connect from client IP {0} to SUT IP {1} failed, reason: {2}", ip.Address, SUTIpAddress, ex.Message)); } } } } } if (networkInfo.LocalIpList.Count == 0) { logWriter.AddLog(LogLevel.Error, "No available local IP address"); } #endregion return(networkInfo); }
/// <summary> /// Load the detected information and bind to the data source /// </summary> /// <param name="detectionInfo"></param> public void LoadDetectionInfo(DetectionInfo detectionInfo) { this.info = detectionInfo; //Add/Update detected share hash generation supported info AddShareHashInfo(ShareHashGeneration.V1Enabled); AddShareHashInfo(ShareHashGeneration.V2Enabled); //Add/Update detected branch cache version supported info AddBranchCacheVersionInfo(BranchCacheVersion.BranchCacheVersion1); AddBranchCacheVersionInfo(BranchCacheVersion.BranchCacheVersion2); //Bind the data to the control resultItemMapList.Add(versionSupportedItems); resultItemMapList.Add(hashSuportedItems); ResultMapList.ItemsSource = resultItemMapList; }
/// <summary> /// Get platform information /// </summary> /// <param name="info">The detection information</param> public void FetchPlatform(DetectionInfo info) { // Set the default values info.SUTPlatform = Platform.NonWindows; try { ManagementObjectCollection resultCollection = QueryWmiObject(info.TargetSUT, "SELECT * FROM Win32_OperatingSystem"); foreach (ManagementObject result in resultCollection) { info.SUTPlatform = ConvertToPlatform(result["Caption"].ToString()); logWriter.AddLog(LogLevel.Information, "Platform: " + info.SUTPlatform); break; } } catch (Exception ex) { logWriter.AddLog(LogLevel.Information, "Detect platform failure. Reason:" + ex.Message); } }
private bool UserLogon(DetectionInfo info, Smb2Client client, out ulong messageId, out ulong sessionId, out Guid clientGuid, out NEGOTIATE_Response negotiateResp) { messageId = 0; sessionId = 0; client.ConnectOverTCP(Dns.GetHostAddresses(info.ContentServerName)[0]); #region Negotiate DialectRevision selectedDialect; byte[] gssToken; Packet_Header header; clientGuid = Guid.NewGuid(); client.Negotiate( 1, 1, Packet_Header_Flags_Values.NONE, messageId++, new DialectRevision[] { DialectRevision.Smb30 }, SecurityMode_Values.NEGOTIATE_SIGNING_ENABLED, Capabilities_Values.GLOBAL_CAP_DFS | Capabilities_Values.GLOBAL_CAP_DIRECTORY_LEASING | Capabilities_Values.GLOBAL_CAP_LARGE_MTU | Capabilities_Values.GLOBAL_CAP_LEASING | Capabilities_Values.GLOBAL_CAP_MULTI_CHANNEL | Capabilities_Values.GLOBAL_CAP_PERSISTENT_HANDLES, clientGuid, out selectedDialect, out gssToken, out header, out negotiateResp); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("NEGOTIATE", header.Status); throw new Exception(string.Format("NEGOTIATE failed with {0}", Smb2Status.GetStatusCode(header.Status))); } #endregion #region Session Setup SESSION_SETUP_Response sessionSetupResp; SspiClientSecurityContext sspiClientGss = new SspiClientSecurityContext( SecurityPackageType, Credential, Smb2Utility.GetCifsServicePrincipalName(ContentServerName), ClientSecurityContextAttribute.None, SecurityTargetDataRepresentation.SecurityNativeDrep); // Server GSS token is used only for Negotiate authentication when enabled if (SecurityPackageType == SecurityPackageType.Negotiate) { sspiClientGss.Initialize(gssToken); } else { sspiClientGss.Initialize(null); } do { client.SessionSetup( 1, 64, Packet_Header_Flags_Values.NONE, messageId++, sessionId, SESSION_SETUP_Request_Flags.NONE, SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_ENABLED, SESSION_SETUP_Request_Capabilities_Values.GLOBAL_CAP_DFS, 0, sspiClientGss.Token, out sessionId, out gssToken, out header, out sessionSetupResp); if ((header.Status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED || header.Status == Smb2Status.STATUS_SUCCESS) && gssToken != null && gssToken.Length > 0) { sspiClientGss.Initialize(gssToken); } } while (header.Status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("SESSIONSETUP", header.Status); throw new Exception(string.Format("SESSIONSETUP failed with {0}", Smb2Status.GetStatusCode(header.Status))); } byte[] sessionKey; sessionKey = sspiClientGss.SessionKey; client.GenerateCryptoKeys(sessionId, sessionKey, true, false, null, false); #endregion return(true); }
/// <summary> /// Get branchcache version supported information, which version SUT supports depends on the IOCTL_READ_HASH response code /// </summary> /// <param name="info">The detection information</param> /// <returns></returns> public VersionInfo FetchVersionInfo(DetectionInfo info) { logWriter.AddLog(LogLevel.Information, "===== Detect Version Info ====="); Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)); AddToClientList(client); Packet_Header header; Guid clientGuid; NEGOTIATE_Response negotiateResp; ulong messageId = 1; ulong sessionId = 0; uint treeId = 0; try { UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp); } catch (Exception ex) { logWriter.AddLog(LogLevel.Warning, "Failed", false, Detector.LogStyle.StepFailed); logWriter.AddLineToLog(LogLevel.Information); logWriter.AddLog(LogLevel.Error, string.Format("User log on failed: {0}", ex.Message)); } detectionInfo.ResetDetectResult(); #region TreeConnect TREE_CONNECT_Response treeConnectResp; string uncSharePath = Smb2Utility.GetUncPath(info.ContentServerName, defaultShare); client.TreeConnect( 1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, uncSharePath, out treeId, out header, out treeConnectResp); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("TREECONNECT", header.Status); throw new Exception("TREECONNECT failed with " + Smb2Status.GetStatusCode(header.Status)); } #endregion CREATE_Response createResp; FILEID fileId; Smb2CreateContextResponse[] serverCreateContexts = null; VersionInfo versionInfo = new VersionInfo(); versionInfo.branchCacheVersion = BranchCacheVersion.NotSupported; string fileName = "MultipleBlocks.txt"; client.Create( 1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, treeId, fileName, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE, ShareAccess_Values.NONE, CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN_IF, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE, null, out fileId, out serverCreateContexts, out header, out createResp); HASH_HEADER hashHeader; byte[] hashData = null; // Trigger to generate Content Information V1 uint status = 0; status = ReadHash( client, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, treeId, sessionId, fileId, SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST, SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_1, SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED, 0, uint.MaxValue, out hashHeader, out hashData); // Retrieve Content Information V1 status = ReadHash( client, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, treeId, sessionId, fileId, SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST, SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_1, SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED, 0, uint.MaxValue, out hashHeader, out hashData); if (status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("READ_HASH_V1", header.Status); } else { versionInfo.branchCacheVersion = BranchCacheVersion.BranchCacheVersion1; } // Trigger to generate Content Information V2 status = ReadHash( client, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, treeId, sessionId, fileId, SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST, SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_2, SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED, 0, uint.MaxValue, out hashHeader, out hashData); status = ReadHash( client, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, treeId, sessionId, fileId, SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST, SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_2, SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED, 0, uint.MaxValue, out hashHeader, out hashData); if (status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("READ_HASH_V2", header.Status); } else { versionInfo.branchCacheVersion |= BranchCacheVersion.BranchCacheVersion2; } try { LOGOFF_Response logoffResponse; client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("LOGOFF", header.Status); } } catch (Exception e) { logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message); } return(versionInfo); }
/// <summary> /// Get share information /// </summary> /// <param name="info">The detection information</param> /// <returns></returns> public ShareInfo FetchShareInfo(DetectionInfo info) { logWriter.AddLog(LogLevel.Information, "===== Detect Share Info ====="); logWriter.AddLog(LogLevel.Information, "Share name: " + defaultShare); Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)); AddToClientList(client); Packet_Header header; Guid clientGuid; NEGOTIATE_Response negotiateResp; ulong messageId = 0; ulong sessionId = 0; uint treeId = 0; try { UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp); } catch (Exception ex) { logWriter.AddLog(LogLevel.Warning, "Failed", false, Detector.LogStyle.StepFailed); logWriter.AddLineToLog(LogLevel.Information); logWriter.AddLog(LogLevel.Error, string.Format("User log on failed: {0}", ex.Message)); } detectionInfo.ResetDetectResult(); #region TreeConnect TREE_CONNECT_Response treeConnectResp; string uncSharePath = Smb2Utility.GetUncPath(info.ContentServerName, defaultShare); client.TreeConnect( 1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, uncSharePath, out treeId, out header, out treeConnectResp); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("TREECONNECT", header.Status); throw new Exception("TREECONNECT failed with " + Smb2Status.GetStatusCode(header.Status)); } ShareInfo shareInfo = new ShareInfo(); shareInfo.ShareName = uncSharePath; shareInfo.shareHashGeneration = ShareHashGeneration.NotEnabled; if (treeConnectResp.ShareFlags.HasFlag(ShareFlags_Values.SHAREFLAG_ENABLE_HASH_V1)) { shareInfo.shareHashGeneration = ShareHashGeneration.V1Enabled; } if (treeConnectResp.ShareFlags.HasFlag(ShareFlags_Values.SHAREFLAG_ENABLE_HASH_V2)) { shareInfo.shareHashGeneration |= ShareHashGeneration.V2Enabled; } #endregion try { LOGOFF_Response logoffResponse; client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse); if (header.Status != Smb2Status.STATUS_SUCCESS) { LogFailedStatus("LOGOFF", header.Status); } } catch (Exception e) { logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message); } return(shareInfo); }