2013-04-19 12 views
9

W systemie operacyjnym Windows, identyfikatory użytkownika są reprezentowane z ciągiem takich jak:Jak ustalić, czy ciąg znaków jest identyfikatorem SID użytkownika?

S-5-1-76-1812374880-3438888550-261701130-6117

Czy jest jakiś sposób, że może zidentyfikować, że taki ciąg jest prawidłowym identyfikatorem SID użytkownika?

Dzięki.

+8

Szukasz weryfikacji lub weryfikacji? W celu weryfikacji wystarczy spróbować uzyskać konto z identyfikatora SID. ([Jak mogę przekonwertować z identyfikatora SID na nazwę konta w języku C#] (http://stackoverflow.com/q/499053/1386111)) –

+0

Nie, szukam weryfikacji. Dzięki –

+0

@ ChibuezeOpata Zasugerował rozwiązanie do weryfikacji - 'Aby zweryfikować po prostu spróbuj uzyskać konto z SID. – DGibbs

Odpowiedz

23

Według Security Identifiers opisie SID ma następującą postać (ma jeden do czternastu wartości subauthority):

S-1-<identifier authority>-<sub1>-<sub2>-…-<subn>-<rid> 

Można użyć wyrażenia regularnego, aby sprawdzić, czy ciąg pasuje do tego wzoru:

string input = "S-5-1-76-1812374880-3438888550-261701130-6117"; 
string sidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$"; 
bool isValidFormat = Regex.IsMatch(input, sidPattern); 

Zapewni to, że wejściowy ciąg znaków ma prawidłowy format, ale to nie udowodni, że identyfikator SID jest ważny. Zgodnie z sugestiami w komentarzach, powinieneś spróbować uzyskać konto, jeśli chcesz sprawdzić, czy masz prawidłowy identyfikator SID.

5

Zauważyłem, że ta niewielka zmiana jest pomocna, co pozwala na użycie niektórych dobrze znanych identyfikatorów zabezpieczeń. Na przykład, dobrze znany identyfikator Każdy S-1-1-0

^S-\d-(\d+-){1,14}\d+$ 
+0

Przydatne dodawanie, dzięki – Basic

1

regex Shoud "S \ D \ D \ D + - \ D + - \ D + - \ D + - \ w +"

1

To nie jest dobry pomysł, aby polegać na wyliczeniu, aby sprawdzić, czy identyfikator SID jest ważny. Po pierwsze, jedyną prawidłową wersją SID jest 1, więc to wyrażenie będzie uważać, że S-9-(\d+-){1,14}\d+ jest ważne, gdy 9 nie jest poprawną wersją. Jednak naprawienie wyrażenia regularnego zezwalającego tylko na dopuszczenie wersji 1 zakończyłoby się niepowodzeniem, gdyby kiedykolwiek powstała nowa wersja SID lub nawet zupełnie nowy format SID. Lepszym sposobem na to jest niech system zdecyduje, czy identyfikator SID jest ważny. Wystarczy to zrobić:

string notSureIfSID = "S-9-5-76-1812374880-3438888550-261701130-6117"; 
bool sidIsValid = false; 
bool sidIsAccount = false; 
try { 
    SecurityIdentifier sid = new SecurityIdentifier(notSureIfSID); 
    sidIsValid = true; 
    sidIsAccount = sid.IsAccountSid(); 
} 
catch (ArgumentException) { 
    // Handle invalid SID 
} 

Jeśli format SID jest nieważna (jeśli na przykład wersja nie jest 1 lub liczbę podrzędnych organów wynosi ponad 15 lub mniej niż 1) konstruktor rzuci ArgumentException. Jeśli chcesz sprawdzić, czy identyfikator SID jest rzeczywistym istniejącym kontem, po prostu zadzwoń pod numer IsAccountSid na SecurityIdentifier.

Powiązane problemy