2017-06-06 249 views
0

我想知道是否可以從x字符到y字符讀取某個長度的字符串,而不必將其分割爲更小的片段。從某個字符讀取字符串

我有以下字符串,在AD CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com的路徑,我想能夠只是讀它的someName部分,鬥而不破的=,第一。我如何實現這一目標?

原因是,我沒有做組比較,因爲我做的是現在:

SearchResult t1 = search.FindOne(); 
foreach (string s in t1.Properties["memberof"]) 
{ 
    foreach (string g in groups) 
    { 
     if (s.ToLower().Contains(g.ToLower())) 
     { 
      // do something 
     } 
    } 
} 

如果子句等號我寧願做,但我不希望總是分裂上面的路徑/組成一個數組兩次。我怎麼做?

+2

_「我沒有做組間比較」 _我不明白,是什麼'groups'? –

+0

@TimSchmelter我正在比較某個用戶是否在某個組中,爲了檢查權限,'groups'是一組有效的組。另外,正如我所說,我想避免使用數組,如果可能的話,我是相對較新的編程,所以我不知道所有的語法,例如LINQ等... – EInherjar

回答

4

使用簡單的字符串操作與IndexOfSubstring

string s = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 

const string prefix = "CN="; 
int start = s.IndexOf(prefix); 
if (start >= 0) 
{ 
    string value = s.Substring(start + prefix.Length, s.IndexOf(',', start) - prefix.Length); 
    Console.WriteLine(value); 
} 

注意,這個簡單的例子將失敗如果CN=項是最後行(因爲它不是由逗號結尾)。您可以通過查看第二個IndexOf調用的返回值來檢查。

但是在這種情況下,無論如何CN=通常是第一件事。

0

With Split您可以檢查是否有任何給定的鍵等於搜索值。

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var searchValue = "someName"; 
var contains = val.Split(',').Any(value => value.Split('=')[0] == prefix && value.Split('=')[1] == searchValue); 

缺省情況下,檢查值是否等於搜索值,您也可以返回該值。

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var foundValue = val.Split(',').FirstOrDefault(value => value.Split('=')[0] == prefix)?.Split('=')[1]; 

我還是習慣Split儘管你說你不想使用它,因爲我認爲它使一個很好的一個襯墊。

+0

我只想看看''CN =「'前綴,因爲這是組名來自的地方,但是謝謝 – EInherjar

+0

@EInherjar我改變了它尋找CN =前綴的代碼。或者我誤解了你? – NtFreX

+0

@EInherjar並且此解決方案可以在字符串中的任何位置使用cn。 – NtFreX

0

您可以使用String.IndexOf查找正確的偏移量,然後使用String.SubString來讀取所需的部分。

const string input = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
const string start = "CN="; 
const string stop = ","; 

int startIndex = input.IndexOf(start, 0); 
int stopIndex = input.IndexOf(stop, startIndex); 

var extracted = input.Substring(startIndex + start.Length, stopIndex - startIndex - start.Length); 

Console.WriteLine(extracted); 

.net Fiddle

PS:也許還看一看Is there a .NET class that can parse CN= strings out of LDAP?爲您的特殊用例!

1

如果你正在做的組間比較,我會用System.DirectoryServices.AccountManagement命名空間

PrincipalContext Context = new PrincipalContext(ContextType.Domain, ""); 
UserPrincipal Usr = UserPrincipal.FindByIdentity(Context, "User"); 
GroupPrincipal G = GroupPrincipal.FindByIdentity(Context, "Group"); 

if(Usr.IsMemberOf(G)) { 

} 
+0

這會起作用,但是如果允許組的數組中存在組,但它在AD中不存在,則會中斷。有什麼辦法可以繞過這個? – EInherjar